2012-03-08 109 views
3

讓我們假設在線程模塊的python代碼中有2個線程和一個全局變量。 在此代碼中,只有線程1修改全局變量的值,而線程2只讀取全局變量的值並根據該值執行其任務。在python的Threading模塊下鎖定全局變量

在這種情況下,我需要使用Lock()來保護對全局變量的訪問嗎?在C中,必須在這種情況下使用互斥鎖。但是,GIL的python呢?它仍然是這樣嗎?是否仍然需要Lock()?

回答

8

將對象值賦給全局變量是Python中的一個原子操作。其他線程在分配時無法正確讀取變量。 GIL在Python的C實現中保證了這一點,但其他實現可以以不同的方式做出相同的保證。

如果全局變量是一個可變對象,如列表,並且您正在修改該對象,則取決於您使用的方法。像列表這樣的內建對象的大多數方法都是原子的。

雖然我不能確定您不需要鎖,但不知道有關該變量用途的更多細節以及您如何使用它。爲什麼線程2需要根據該值更改其行爲,如果線程1剛剛在線程2做出決定之後更改了值,那麼它是否正常?如果不行,您可能仍然需要一個鎖。

(在C類似的情況 - 將值分配給一個指針變量 - 也是在正常情況下的原子,雖然指針分配可以被重新排序可以使用此在某些情況下,以避免在C.鎖。)