1 2/* This is the most trivial test I could think of that involves 3 barriers. If H fails to notice the pthread_barrier_wait call then 4 it will report a race. Correct behaviour is not to report a race 5 (there isn't one.) */ 6#define _GNU_SOURCE 7#include <pthread.h> 8#include <stdio.h> 9#include <stdlib.h> 10#include <assert.h> 11#include <unistd.h> 12 13int x = 0; 14 15pthread_barrier_t bar; 16 17void* child_fn ( void* arg ) 18{ 19 long r, n = (long)arg; 20 21 if (n == 1) x++; 22 23 r = pthread_barrier_wait(&bar); 24 assert(r == 0 || r == PTHREAD_BARRIER_SERIAL_THREAD); 25 26 if (n == 0) x++; 27 28 sleep(1); /* ensure both threads get to this point before 29 either exits. */ 30 return NULL; 31} 32 33#define NTHR 2 34 35int main ( void ) 36{ 37 long i, r; 38 pthread_t thr[NTHR]; 39 40 r = pthread_barrier_init(&bar, NULL, NTHR); 41 assert(!r); 42 43 for (i = 0; i < NTHR; i++) { 44 r = pthread_create(&thr[i], NULL, child_fn, (void*)i); 45 assert(!r); 46 } 47 48 for (i = 0; i < NTHR; i++) { 49 r = pthread_join(thr[i], NULL); 50 assert(!r); 51 } 52 53 r = pthread_barrier_destroy(&bar); assert(!r); 54 55 printf("x = %d\n", x); 56 return 0; 57} 58