我在求職面試中遇到了這個問題,對於我的生活我找不到答案(他們最終沒有告訴你答案,因爲這是一個書面測試):找不到死鎖
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將繼續使用舊的緩存值,但這對我來說似乎很奇怪。
問題是? – carlito
問題是(也是編輯後) - 當thread1處於某種死鎖狀態時,thread2如何完成? –
'volatile'? 't1()'可能不知道't2()'已經改變了'thread2_finished'的值。如果兩個線程在不同的CPU內核上運行,我想這可能會發生。 – Kane