mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
68 lines
1.3 KiB
C
68 lines
1.3 KiB
C
|
|
/* I don't think this is a very good test .. all this
|
|
sleepery is highly confusing. */
|
|
|
|
/* test child thread inheriting data */
|
|
|
|
#include <stdio.h>
|
|
#include <pthread.h>
|
|
#include <unistd.h>
|
|
|
|
static volatile int shared[2];
|
|
|
|
static void *t1(void *v)
|
|
{
|
|
volatile int *ip = (int *)v;
|
|
if (0) printf("ta W\n");
|
|
*ip += 44;
|
|
*ip *= 2;
|
|
sleep(1);
|
|
return 0;
|
|
}
|
|
|
|
static void *t2(void *v)
|
|
{
|
|
volatile int *ip = (int *)v;
|
|
sleep(2);
|
|
if (0) printf("tb W\n");
|
|
*ip += 88;
|
|
*ip *= 3;
|
|
sleep(1);
|
|
return 0;
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
pthread_t a, b;
|
|
volatile int ret = 0;
|
|
|
|
sleep(0);
|
|
|
|
shared[0] = 22;
|
|
shared[1] = 77;
|
|
|
|
pthread_create(&a, NULL, t1, (void *)&shared[0]);
|
|
// a steals shared[0] from root thread, so is excl(a)
|
|
pthread_create(&b, NULL, t2, (void *)&shared[1]);
|
|
// b steals shared[1] from root thread, so is excl(b)
|
|
|
|
pthread_join(a, NULL);
|
|
// b's stuff (shared[1]) still belongs to b, so is excl(b)
|
|
|
|
// ret is excl(root), and shared[0] is re-acquired as excl(root)
|
|
// since a joined to root
|
|
if (0) printf("r R1\n");
|
|
ret += shared[0]; /* no error - a is finished */
|
|
|
|
// but shared[1] is excl(b); hence we're reading excl(b)
|
|
// without a lock and without a dependency edge
|
|
if (0) printf("r R2\n");
|
|
ret += shared[1]; /* expect error - b has not finished,
|
|
so we can't touch shared[1] yet */
|
|
|
|
pthread_join(b, NULL);
|
|
|
|
|
|
return ret;
|
|
}
|