我寫信是想從 Allen B. Downey 的“信號量小書”中詢問這個問題。
來自“信號量小書”的問題
謎題:假設 100 個執行緒同時運行以下程式。(如果您不熟悉 Python,
for回圈運行更新 100 次。):for i in range(100): temp = count count = temp 1
count在所有執行緒完成后,最大可能值是多少?最小的可能值是多少?提示:第一個問題很簡單;第二個不是。
我的理解是這count是一個所有執行緒共享的變數,它的初始值為0。我認為最大可能值為10,000,這發生在執行緒之間沒有交錯的情況下。
我相信最小的可能值是 100。如果為每個執行緒執行第 2 行,它們每個都有一個temp = 0. 如果隨后為每個執行緒執行第 3 行,它們將各自設定count = 1. 如果每次迭代都發生相同的行為,則 的最終值為count100。
這是正確的,還是有另一個執行路徑可以導致小于 100 的值count?
uj5u.com熱心網友回復:
我能想到的最壞情況將count等于 2。這在實踐中是極不可能發生的,但從理論上講,這是可能的。我需要談談執行緒 A、執行緒 B 和其他 98 個執行緒:
- 執行緒 A 讀取
count為零,但在它可以做任何其他事情之前它被搶占了, - 執行緒 B 被允許運行其回圈的 99 次迭代,其他 98 個執行緒全部運行完成,然后執行緒 A 最終被允許再次運行,
- 執行緒 A 將 1 寫入
count之前——你準備好相信了嗎?——它再次被搶占! - 執行緒 B 開始其第 100 次迭代。在執行緒 A 最終恢復生機并運行到完成之前,它讀取
count到 1(剛剛由執行緒 A 寫入), - 執行緒 B 在將 2 寫入 后最后一個越過終點線
count。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/486657.html
