2016-06-15 54 views
0
count = 10; //may queried from DB 

while(0 != count) { 
    --count; 
    //do_lottery(); 
} 

我聽過一個故事,使用這段代碼公司出人意料地給出了很多臺iPad作爲禮物。 因爲計數器低於0,代碼仍然沒有結束運行。使用時的危害有哪些「!=」「不等於」處於停車狀態

它怎麼會發生?任何情況?

關於多線程和鎖?

+0

** T1:計數= 1 => 0 =計數**; T2:count = 1 => 0!= count; ** T1:--count; => count = 0 **; T2:--count; => count = -1; –

+0

檢查https://deadlockempire.github.io/ – zerkms

回答

1

當然,使用線程,這是可能的。

比方說,你有兩個線程運行完全相同的代碼和count設置爲一。

線程1個檢查條件並進入循環,但是它可以遞減count之前,它的換出螺紋2.

線程2進入循環(因爲count仍然是一個)和被交換之前遞減count出。 count現在爲零。

線程1然後再次運行,它執行的代碼是遞減count(負1)。此時,count在相當長的一段時間後會再次達到零,假設它完全包裹。同時,這兩個線程將繼續運行。

但是,這不是一個使用「錯誤」比較運算符的問題,因爲它不會保護資源免受多線程併發訪問的影響。換句話說,類似的代碼(使用信號量的相互排斥沿着!=)將正常工作:

count = 10; 
init_mutex(count_lock); 

lock_mutex(count_lock); 
while (0 != count) { 
    --count; 
    unlock_mutex(count_lock); 
    do_lottery(); 
    lock_mutex(count_lock); 
} 
unlock_mutex(count_lock); 
相關問題