#include #include #include /* 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; }