| |
| #include <pthread.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| /* Simple test program, has a race. Parent and child both modify y |
| with no locking. This is the program shown in Fig 2 of the |
| original Eraser paper by Savage et al. */ |
| |
| int y = 0, v = 0; |
| pthread_mutex_t mu = PTHREAD_MUTEX_INITIALIZER; |
| |
| void* child_fn ( void* arg ) |
| { |
| /* "Thread 2" in the paper */ |
| pthread_mutex_lock( &mu ); |
| v = v + 1; |
| pthread_mutex_unlock( &mu ); |
| y = y + 1; |
| return NULL; |
| } |
| |
| int main ( void ) |
| { |
| const struct timespec delay = { 0, 100 * 1000 * 1000 }; |
| pthread_t child; |
| if (pthread_create(&child, NULL, child_fn, NULL)) { |
| perror("pthread_create"); |
| exit(1); |
| } |
| nanosleep(&delay, 0); |
| /* "Thread 1" in the paper */ |
| y = y + 1; |
| pthread_mutex_lock( &mu ); |
| v = v + 1; |
| pthread_mutex_unlock( &mu ); |
| |
| if (pthread_join(child, NULL)) { |
| perror("pthread join"); |
| exit(1); |
| } |
| |
| return 0; |
| } |