mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
45 lines
936 B
C
45 lines
936 B
C
|
|
#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;
|
|
}
|