// Test Thread and AtomicInt void test02() { const Uint32 numThreads = 64; AtomicInt * atom = new AtomicInt(0); Thread* threads[numThreads]; (*atom)++; Boolean zero = atom->decAndTestIfZero(); PEGASUS_TEST_ASSERT(zero); for (Uint32 i=0; i<numThreads; i++) { threads[i] = new Thread(atomicIncrement, atom, false); } for (Uint32 i=0; i<numThreads; i++) { threads[i]->run(); } for (Uint32 i=0; i<numThreads; i++) { threads[i]->join(); delete threads[i]; } PEGASUS_TEST_ASSERT(atom->get() == numThreads); delete atom; }
ThreadReturnType PEGASUS_THREAD_CDECL atomicIncrement(void * parm) { Thread* my_thread = (Thread *)parm; AtomicInt * atom = (AtomicInt *)my_thread->get_parm(); (*atom)++; (*atom)++; (*atom)++; (*atom)++; (*atom)++; (*atom)--; (*atom)--; (*atom)--; Boolean zero = atom->decAndTestIfZero(); PEGASUS_TEST_ASSERT(zero == false); return ThreadReturnType(0); }