找不到死锁

标签 c synchronization deadlock

我在求职面试中遇到了这个问题,但我一直找不到答案(而且最后他们不会告诉你答案,因为这是笔试):

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");
}

我们所知道的是,它在大多数情况下都有效 - 但有时线程 1 永远不存在(不打印最后一条消息)而线程 2 确实 打印他的所有消息 - 这怎么可能?

我猜我在这里遗漏了一些基本的东西,但我唯一能想到的是缓存的问题——比如 T1 加载值 (0) 并缓存它,然后 T2 立即将值更改为1,但出于某种奇怪的原因,T1 将继续使用旧的缓存值,但这对我来说似乎很奇怪。

最佳答案

这样写的代码看起来是正确的(而且是合乎逻辑的)但是如果你使用真实环境它不能正常工作,修复将是 volatile 关键字但是原因是有点复杂,还因为这个关键字的行为改变了每种语言/编译器,这里是正确的 answer

关于找不到死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17316167/

相关文章:

c - 如何在 Linux 中使用 SDL?

c - 在 X 上正确设置窗口位置

Java:惰性初始化单例

java - 线程1在java同步方法1中执行,线程2是否可以在java同步方法2中执行?

c++ - 同步工作线程

c++ - 生产者-消费者模型

c - 在 C 中创建一个 StartsWith 函数,得到 "Segmentation fault",有什么问题吗?

c - C 中没有 fork 的无名管道

java - Eclipse - 允许死锁运行时选项

java - 如何在 Java 中防止这种简单的死锁?