【发布时间】:2013-06-26 09:21:31
【问题描述】:
我在一次求职面试中遇到了这个问题,我一生都找不到答案(他们不会在最后告诉你答案,因为这是笔试):
int thread2_finished = 0;
void t1() {
printf("t1 is running\n");
while (!thread2_finished) { usleep(50); }
printf("t2 is doing stuff\n");
}
void t2() {
printf("t2 is running\n");
sleep(5);
printf("t2 woke up\n");
thread2_finished = 1;
printf("t2 finished\n");
}
我们所知道的是它在大多数情况下都有效 - 但有时 thread1 永远不存在(不打印最后一条消息),而 thread2 确实 打印他的所有消息 - 这怎么可能?
我猜我在这里遗漏了一些基本的东西,但我唯一能想到的问题在于缓存 - 比如 T1 加载值 (0) 并缓存它,然后 T2 立即将值更改为1,但出于某种奇怪的原因,T1 将继续使用旧的缓存值,但这对我来说似乎很奇怪。
【问题讨论】:
-
问题是?
-
问题是(也已编辑帖子) - thread2 怎么可能在 thread1 处于某种死锁状态时完成?
-
volatile?t1()可能不知道t2()已更改thread2_finished的值这一事实。我相信,如果两个线程在不同的 CPU 内核上运行,这可能会发生。
标签: c synchronization deadlock