2016-10-28 39 views
2

可以說我有一個程序,它初始化隨機值的列表。應用程序然後產生一堆線程,每個線程都會彈出這個共享列表中的項目。我的問題是,在此操作線程安全:是list.pop在Python線程安全

try: 
    while global_list.pop(): 
     ...do something .. 
except: 
    print ("list is empty") 

將以往任何時候的情況是,數據丟失是由於

編輯線程之間的競爭條件:我剛纔提到鏈接Are lists thread-safe,但有操縱對於引用問題中的列表數據,我只是在討論將列表中的項目彈出列表而不是修改列表中的數據。在我的代碼片斷中,某些東西並不表示對列表數據的操作,它只是一些與列表數據無關的處理。

+0

問題編輯,引用鏈接並不回答我的問題 –

+1

有collections'模塊中'一個線程隊列/隊列支持彈出兩者LIFO和FIFO模式。 –

+0

我知道這一點,我的問題與列表如何表現無法找到替代方法有關。 –

回答

2

我的答案是 - 爲了得到被同時使用多個線程全局列表的元素OUT(彈出),是線程安全的

原因是因爲它是原子操作。在時間

一個操作是原子操作。

檢查這個link

作用於共享存儲器的操作上述鏈接

是原子的,如果它在 單一步驟相對於其他線程完成。當一個原子存儲是對共享變量執行的 時,沒有其他線程可以觀察到修改半完成。當在 共享變量執行的原子負載時,它讀取當時出現的單個 時刻整個值。非原子加載和存儲不保證這些 。

在列表中的任何操作不會是原子操作,所以格外小心,需要採取使其使用鎖,事件,條件或信號等 這在Are lists thread-safe這裏解釋線程安全的。