#include #include #include #include struct barrier { int barrier_size; int count; int round; pthread_mutex_t mutex; }; void barrier_init(struct barrier* barrier, int barrier_size) { barrier->barrier_size = barrier_size; barrier->count = 0; barrier->round = 0; pthread_mutex_init(&barrier->mutex, NULL); } void barrier_wait(struct barrier* barrier) { pthread_mutex_lock(&barrier->mutex); int cur_round = barrier->round; barrier->count ++; if(barrier->count == barrier->barrier_size) { pthread_mutex_unlock(&barrier->mutex); barrier->round++; barrier->count = 0; } else { pthread_mutex_unlock(&barrier->mutex); while(barrier->round == cur_round) { sched_yield(); } } } void* worker(void* arg) { struct barrier *b = (struct barrier*) arg; static _Atomic int next_id = 0; int my_id = next_id++; for(int i=0; i<10; i++) { printf("Hello from thread %d\n", my_id); barrier_wait(b); printf("Goodbye from thread %d\n", my_id); barrier_wait(b); } return NULL; } int main(int argc, char**argv) { pthread_t tid[4]; struct barrier barrier; barrier_init(&barrier, 4); for(int i = 0; i<4; i++) { pthread_create(&tid[i], NULL, worker, &barrier); } for(int i = 0; i<4; i++) { pthread_join(tid[i], NULL); } return EXIT_SUCCESS; }