1 /* $OpenBSD: barrier.c,v 1.2 2020/04/06 00:01:08 pirofti Exp $ */ 2 /* Paul Irofti <paul@irofti.net>, 2012. Public Domain. */ 3 4 #include <stdio.h> 5 6 #include <pthread.h> 7 #include <errno.h> 8 9 #include "test.h" 10 11 void * 12 foo(void *arg) 13 { 14 int rc = 0; 15 pthread_barrier_t b = (pthread_barrier_t)arg; 16 rc = pthread_barrier_wait(&b); 17 if (rc != 0 && rc != PTHREAD_BARRIER_SERIAL_THREAD) 18 PANIC("pthread_barrier_wait returned %d", rc); 19 return NULL; 20 } 21 22 int main() 23 { 24 int i; 25 pthread_t thr[10]; 26 pthread_barrier_t b; 27 28 pthread_barrierattr_t attr; 29 CHECKr(pthread_barrierattr_init(&attr)); 30 CHECKr(pthread_barrierattr_getpshared(&attr, &i)); 31 _CHECK(i, == PTHREAD_PROCESS_PRIVATE, strerror(_x)); 32 CHECKr(pthread_barrierattr_setpshared(&attr, i)); 33 _CHECK(pthread_barrierattr_setpshared(&attr, PTHREAD_PROCESS_SHARED), == ENOTSUP, strerror(_x)); 34 35 CHECKr(pthread_barrier_init(&b, &attr, 10)); 36 for (i = 0; i < 10; i++) { 37 printf("Thread %d started\n", i); 38 CHECKr(pthread_create(&thr[i], NULL, foo, (void *)b)); 39 } 40 for (i = 0; i < 10; i++) { 41 CHECKr(pthread_join(thr[i], NULL)); 42 } 43 CHECKr(pthread_barrierattr_destroy(&attr)); 44 CHECKr(pthread_barrier_destroy(&b)); 45 46 SUCCEED; 47 } 48