1 #include <pthread.h> 2 3 #if defined(__APPLE__) || !defined(_POSIX_BARRIERS) 4 5 #undef pthread_barrier_t 6 7 typedef struct { 8 int needed; 9 int called; 10 pthread_mutex_t mutex; 11 pthread_cond_t cond; 12 } pthread_barrier_t; 13 14 #if defined(__cplusplus) 15 extern "C" { 16 #endif 17 18 int pthread_barrier_init(pthread_barrier_t *barrier, void * attr, int needed); 19 int pthread_barrier_destroy(pthread_barrier_t *barrier); 20 int pthread_barrier_wait(pthread_barrier_t *barrier); 21 pthread_barrier_init(pthread_barrier_t * barrier,void * attr,int needed)22 int pthread_barrier_init(pthread_barrier_t *barrier, void * attr, int needed) 23 { 24 barrier->needed = needed; 25 barrier->called = 0; 26 pthread_mutex_init(&barrier->mutex,NULL); 27 pthread_cond_init(&barrier->cond,NULL); 28 return 0; 29 } 30 pthread_barrier_destroy(pthread_barrier_t * barrier)31 int pthread_barrier_destroy(pthread_barrier_t *barrier) 32 { 33 pthread_mutex_destroy(&barrier->mutex); 34 pthread_cond_destroy(&barrier->cond); 35 return 0; 36 } 37 pthread_barrier_wait(pthread_barrier_t * barrier)38 int pthread_barrier_wait(pthread_barrier_t *barrier) 39 { 40 pthread_mutex_lock(&barrier->mutex); 41 barrier->called++; 42 if (barrier->called == barrier->needed) { 43 barrier->called = 0; 44 pthread_cond_broadcast(&barrier->cond); 45 } else { 46 pthread_cond_wait(&barrier->cond,&barrier->mutex); 47 } 48 pthread_mutex_unlock(&barrier->mutex); 49 return 0; 50 } 51 52 #if defined(__cplusplus) 53 } 54 #endif 55 56 #endif 57