// Test Thread and AtomicInt void test02() { const Uint32 numThreads = 64; AtomicInt * atom = new AtomicInt(0); Thread* threads[numThreads]; (*atom)++; Boolean zero = atom->DecAndTestIfZero(); 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]; } assert(atom->value() == numThreads); delete atom; }
PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL atomicIncrement(void * parm) { Thread* my_thread = (Thread *)parm; AtomicInt * atom = (AtomicInt *)my_thread->get_parm(); (*atom)++; (*atom)+=4; (*atom)-=2; (*atom)--; Boolean zero = atom->DecAndTestIfZero(); assert(zero == false); my_thread->exit_self(0); return 0; }