这是我的线程学习测试的一段代码:
int mylock = 0;
void *r1(void *x)
{
puts("entered r1");
int *p;
p = (int *)x;
int i = *p;
sleep(1);
*p = --i;
printf("r1: %d\n",*p);
mylock = 1;
printf("r1: done\n");
#ifdef USETHREADS
pthread_exit(0);
#endif
}
void *r2(void *x)
{
puts("entered r2");
if (!mylock) {
puts("r2 is waiting...");
while (!mylock)
printf("");
}
int *p;
p = (int *)x;
int i = *p;
*p = ++i;
sleep(1);
printf("r2: %d\n",*p);
printf("r2: done\n");
#ifdef USETHREADS
pthread_exit(0);
#endif
}
main()
{
int i1,i2;
i1 = 1;
i2 = 2;
printf("i1: %d\n", i1);
#ifdef USETHREADS
pthread_t r1_thread, r2_thread;
pthread_create(&r1_thread, NULL, r1, &i1);
pthread_create(&r2_thread, NULL, r2, &i1);
pthread_join(r1_thread, NULL);
pthread_join(r2_thread, NULL);
#else
r1(&i1);
r2(&i1);
#endif
printf("i1: %d\n", i1);
return 0;
}
所以有两个线程,一个增加 i1,一个减少(我知道 pthread 中的“互斥锁”,虽然此时不使用),所以为了避免竞争条件,我创建了 mylock(我猜它伪造互斥锁),这让我感到惊讶进程是否在等待 mylock 更改值时卡在未定义的循环中,除非我printf
在等待循环中调用,使用 printf 调用它会在预期的 2 秒内退出,这是 linux 的谜吗?