0
count = 10; //may queried from DB
while(0 != count) {
--count;
//do_lottery();
}
我聽過一個故事,使用這段代碼公司出人意料地給出了很多臺iPad作爲禮物。 因爲計數器低於0,代碼仍然沒有結束運行。使用時的危害有哪些「!=」「不等於」處於停車狀態
它怎麼會發生?任何情況?
關於多線程和鎖?
count = 10; //may queried from DB
while(0 != count) {
--count;
//do_lottery();
}
我聽過一個故事,使用這段代碼公司出人意料地給出了很多臺iPad作爲禮物。 因爲計數器低於0,代碼仍然沒有結束運行。使用時的危害有哪些「!=」「不等於」處於停車狀態
它怎麼會發生?任何情況?
關於多線程和鎖?
當然,使用線程,這是可能的。
比方說,你有兩個線程運行完全相同的代碼和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);
** T1:計數= 1 => 0 =計數**; T2:count = 1 => 0!= count; ** T1:--count; => count = 0 **; T2:--count; => count = -1; –
檢查https://deadlockempire.github.io/ – zerkms