User:Kr/exit race.c
From Apache OpenOffice Wiki
A race between threads and the "exit" call ...
[cpp]
/*Solaris:
> cc exit_race.c -o exit_race.bin > ./exit_race.bin main - tid: 1 foo - tid: 2 bar - tid: 2 main - ad: 1
Linux: > gcc -g exit_race.c -lpthread > ./exit_race.bin main - tid: b7ddbac0 foo - tid: b7ddab90 bar - tid: b7ddab90 main - ad: 1
- /
- include <pthread.h>
- include <stdio.h>
- include <stdlib.h>
- include <unistd.h>
- ifdef __PRETTY_FUNCTION__
- define PFUN __PRETTY_FUNCTION__
- else
- define PFUN __func__
- endif
static void * foo(void * gr) {
fprintf(stderr, "%s - tid: %x\n", PFUN, pthread_self());
sleep(5);
exit(0);
}
static volatile int ad = 0;
- ifdef __GNUC__
static void bar(void) __attribute__((destructor));
- endif
static void bar(void) {
fprintf(stderr, "%s - tid: %x\n", PFUN, pthread_self());
ad = 1;
sleep(5); // this just stands for some slow de-initialization
}
- ifdef __SUNPRO_C
- pragma fini(bar)
- endif
static pthread_t bt;
static void main_cleanup(void * gr) {
fprintf(stderr, "%s - tid: %x\n", PFUN, pthread_self());
}
int main() {
fprintf(stderr, "%s - tid: %x\n", PFUN, pthread_self());
pthread_create(&bt, NULL, foo, NULL);
while (!ad) ; // Busy wait for ad to change!
fprintf(stderr, "%s - ad: %i\n", PFUN, ad);
pthread_exit(NULL);
}