2015-07-20 104 views
2

我學習Python的線程與http://www.python-course.eu/threads.php 這段代碼的解釋幫助處理確實讓我困惑:線程爲什麼會進入睡眠狀態?

from thread import start_new_thread 

num_threads = 0 
def heron(a): 
    global num_threads 
    num_threads += 1 

    # code has been left out, see above(some operations) 
    num_threads -= 1 
    return new 

start_new_thread(heron,(99,)) 
start_new_thread(heron,(999,)) 
start_new_thread(heron,(1733,)) 
start_new_thread(heron,(17334,)) 

while num_threads > 0: 
    pass 

代碼:

num_threads += 1 

讀取num_thread的價值

新的int實例會增加或減少1(我認爲會創建一個新的int對象)

分配新值NUM_THREADS

象這樣的錯誤發生在增量分配的情況下:

第一個線程讀取變量NUM_THREADS,仍然具有值0 這裏談到的是困惑:讀取此值後,線程將被操作系統置入睡眠狀態。現在輪到第二個線程:它還讀取變量num_threads的值,該變量仍然爲0,因爲第一個線程已經過早睡眠了,也就是在它能夠將其值增加1之前。現在,第二個線程進入睡眠狀態。現在輪到了第三個線程,它再次讀取一個0,但現在計數器應該是2。這些線程中的每個線程現在將值1分配給計數器。減量操作會發生類似的問題。

回答

2

這裏的線索是線程在概念上是併發的(它們彼此運行),但實際上是連續的。您的CPU的每個核心一次只能執行一項操作,因此爲了給您一個印象,即您的計算機處於多任務狀態,CPU將以非常高的速度切換正在執行的操作。通常你的操作系統會爲你處理這個問題。

由於num_threads += 1實際上是兩個語句,即temp_num = num_threads + 1num_threads = temp_num,可能會發生您的CPU正在執行的線程在這兩個操作之間切換。

這說明了在幾個線程之間訪問共享數據的一些危險。

如果你想了解更多關於你應該做什麼和不應該做什麼的話題,你應該找的關鍵字是thread safe

需要注意的是,如果線程是真正併發的,情況不會有太大的改善,因爲您仍然可能在錯誤的時間(甚至在寫入時)從共享內存中讀取數據。

+0

Thks!然後出現線程安全的話題。 –

相關問題