mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
45 lines
1.1 KiB
C
45 lines
1.1 KiB
C
|
|
#include <pthread.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
/* Simple test program, no race: parent only modifies x after child
|
|
has modified it and then joined with the parent. Tests simple
|
|
thread lifetime segment handling. */
|
|
|
|
/* A simple function to "use" a value, so that gcc can't
|
|
possibly optimise it into nothing. */
|
|
static void use ( int x ) {
|
|
__asm__ __volatile__( "" : : "r"(x) : "cc","memory" );
|
|
}
|
|
|
|
static void* worker_thread ( void* argV )
|
|
{
|
|
int* arg = (int*)argV;
|
|
use(arg[5]); /* read access */
|
|
return NULL;
|
|
}
|
|
|
|
int main ( void )
|
|
{
|
|
pthread_t thread_id;
|
|
volatile int* x = malloc(10 * sizeof(int));
|
|
x[5] = 1;
|
|
/* x[5] is Excl(parent) */
|
|
|
|
pthread_create(&thread_id, 0, worker_thread, (void*)x);
|
|
|
|
use(x[5]); /* read access */
|
|
|
|
/* Just before the threads join, x[5] is ShR (read by both parent
|
|
and child) */
|
|
pthread_join(thread_id, 0);
|
|
/* x[5] is Excl(parent), because only parent and child accessed it
|
|
and child has merged to parent. So now it's ok for parent to
|
|
access it without locking. */
|
|
|
|
x[5] = 0; /* write access */
|
|
|
|
return x[5];
|
|
}
|