mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
58 lines
1.1 KiB
C
58 lines
1.1 KiB
C
|
|
/* This is the most trivial test I could think of that involves
|
|
barriers. If H fails to notice the pthread_barrier_wait call then
|
|
it will report a race. Correct behaviour is not to report a race
|
|
(there isn't one.) */
|
|
#define _GNU_SOURCE
|
|
#include <pthread.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <assert.h>
|
|
#include <unistd.h>
|
|
|
|
int x = 0;
|
|
|
|
pthread_barrier_t bar;
|
|
|
|
void* child_fn ( void* arg )
|
|
{
|
|
long r, n = (long)arg;
|
|
|
|
if (n == 1) x++;
|
|
|
|
r = pthread_barrier_wait(&bar);
|
|
assert(r == 0 || r == PTHREAD_BARRIER_SERIAL_THREAD);
|
|
|
|
if (n == 0) x++;
|
|
|
|
sleep(1); /* ensure both threads get to this point before
|
|
either exits. */
|
|
return NULL;
|
|
}
|
|
|
|
#define NTHR 2
|
|
|
|
int main ( void )
|
|
{
|
|
long i, r;
|
|
pthread_t thr[NTHR];
|
|
|
|
r = pthread_barrier_init(&bar, NULL, NTHR);
|
|
assert(!r);
|
|
|
|
for (i = 0; i < NTHR; i++) {
|
|
r = pthread_create(&thr[i], NULL, child_fn, (void*)i);
|
|
assert(!r);
|
|
}
|
|
|
|
for (i = 0; i < NTHR; i++) {
|
|
r = pthread_join(thr[i], NULL);
|
|
assert(!r);
|
|
}
|
|
|
|
r = pthread_barrier_destroy(&bar); assert(!r);
|
|
|
|
printf("x = %d\n", x);
|
|
return 0;
|
|
}
|