2016-10-28 3 views
2

lässt sagen, ich habe ein Programm, das eine Liste mit zufälligen Werten initialisiert. Die Anwendung erzeugt dann eine Reihe von Threads, und jeder Thread hält Objekte aus dieser freigegebenen Liste heraus. Meine Frage ist, wird dieser Vorgang Thread-sicher:ist list.pop thread sicher in python

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

Wird es jemals der Fall sein, dass Daten aufgrund von Racebedingung zwischen Threads verloren

EDIT: ich genannt habe Are lists thread-safe zu verbinden, aber es ist Manipulation Auf Listendaten in der referenzierten Frage spreche ich nur über das Herausspringen von Elementen aus der Liste, die die Liste und nicht die darin enthaltenen Daten verändern. In meinem Code-Snippet bedeutet etwas nicht Operationen auf Listendaten, es ist einfach eine Verarbeitung, die nichts mit Listendaten zu tun hat.

+0

Frage bearbeitet, referenzierter Link beantwortet meine Frage nicht –

+1

Es gibt eine threadsafe Warteschlange/Warteschlange in 'Sammlungen' Modul, das Popup und beide LIFO und FIFO-Modi unterstützt. –

+0

Ich bin mir wieder dessen bewusst, meine Frage bezieht sich darauf, wie sich Listen verhalten, wenn sie keine Alternative finden. –

Antwort

2

Meine Antwort wäre JA-Element Um aus (pop) der globalen Liste, die von mehreren Threads in einer Zeit verwendet wird, ist Thread-sicher

Grund ist, weil es ist Atom Operation.

Eine Operation auf einmal ist ein atomarer Vorgang.

Überprüfen Sie diese link.

Von oben Link

eine Operation auf gemeinsam genutzten Speicher wirkende atomare wenn es in einem einzigen Schritt relativ zu anderen Threads abgeschlossen ist. Wenn ein atomarer Speicher für eine freigegebene Variable ausgeführt wird, kann kein anderer Thread die Änderung halb abgeschlossen beobachten. Wenn eine atomare Last für eine gemeinsam genutzte Variable ausgeführt wird, liest sie den gesamten Wert, wie er bei einem einzelnen Zeitpunkt aufgetreten ist. Nicht-atomare Lasten und Geschäfte machen diese Garantien nicht.

Jede Manipulation der Liste nicht atomare Operation sein, so besonders darauf geachtet werden, müssen sie fädeln macht sicher mit Lock, Ereignisse, Zustand oder Semaphore usw. Dies ist in Are lists thread-safe hier erklärt.