void * func(void * arg) { sched_yield(); seqmap[(int)pthread_getunique_np(pthread_self())] = 1; InterlockedIncrement(&done); return (void *) 0; }
long cp_pooled_thread_get_id(cp_pooled_thread *pt) { long id = 0; #ifdef CP_HAS_PTHREAD_GETUNIQUE_NP pthread_getunique_np(*pt->worker, &id); #else id = (long) *pt->worker; #endif return id; }
void* GThread::current() { pthread_t self = pthread_self(); #if defined(pthread_getunique_np) return (void*) pthread_getunique_np( & self ); #elif defined(cma_thread_get_unique) return (void*) cma_thread_get_unique( & self ); #else return (void*) self; #endif }
int main() { pthread_t t[NUMTHREADS]; pthread_attr_t attr; int i; assert(pthread_attr_init(&attr) == 0); assert(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == 0); for (i = 0; i < NUMTHREADS+2; i++) { seqmap[i] = 0; } for (i = 0; i < NUMTHREADS; i++) { if (NUMTHREADS/2 == i) { /* Include this main thread, which will be an implicit pthread_t */ seqmap[(int)pthread_getunique_np(pthread_self())] = 1; } assert(pthread_create(&t[i], &attr, func, NULL) == 0); } while (NUMTHREADS > InterlockedExchangeAdd((LPLONG)&done, 0L)) Sleep(100); Sleep(100); assert(seqmap[0] == 0); for (i = 1; i < NUMTHREADS+2; i++) { assert(seqmap[i] == 1); } return 0; }