2012-04-12 7 views
2

Bitte ertragen Sie mich, da ich neu bin.Gewindesicherheit für Arrays in D?

Ich habe ein Array und zwei Threads.

erster Thread anfügt neue Elemente in das Array, wenn

erforderlich
myArray ~= newArray; 

Zweite Gewindeelemente aus dem Array entfernt, wenn erforderlich:

extractedArray = myArray[0..10]; 
myArray = myArray[10..myArray.length()]; 

Ist das Thread-sicher? Was passiert, wenn die beiden Threads genau gleichzeitig auf dem Array interagieren?

Antwort

2

dies nicht sicher ist, fädelt

dies hat die klassischen verlorene Update Rennen:

anhängen Mittel, um das Array examening zu sehen, ob es an Ort und Stelle erweitern, wenn nicht sogar braucht es ein (O machen (n) Zeit) kopieren, während die Kopie besetzt ist der andere Thread eines Stückes in Scheiben schneiden kann, und wenn die Kopie dieses Stück fertig ist, wird das Rück

Sie in mit einer verketteten Liste Umsetzung aussehen sollen, die leichter zu Thread-sicher machen

Javas ConcurrentLinkedQueue verwendet die Liste described here für seine Implementierung und Sie können es mit der core.atomic.cas() in der Standardbibliothek implementieren

+0

Danke dafür. – ains

2

Es ist nicht Thread-sicher. Der einfachste Weg, dies zu beheben, besteht darin, Array-Operationen mit dem synchronized Block zu umgeben. Mehr dazu hier: http://dlang.org/statement.html#SynchronizedStatement

+2

Beachten Sie, dass mehrere "synchronisierte" Blöcke (ohne einen Ausdruck) nicht miteinander synchronisiert werden. –

+0

Danke für die Info. – ains

4

Nein, es ist nicht thread-safe. Wenn Sie Daten über Threads gemeinsam nutzen, müssen Sie sich damit befassen, dass Sie sich selbst über Einrichtungen wie , synchronized functions, und mutexes threadsicher machen.

Die andere wichtige Sache, auf die hingewiesen werden muss, ist jedoch, dass alle Daten in D standardmäßig Thread-lokal sind. So können Sie nicht zugreifen Daten über Threads, es sei denn, es ist explizit shared. Normalerweise müssen Sie sich also überhaupt nicht um die Sicherheit von Fäden kümmern. Nur wenn Sie Daten explizit freigeben, ist dies ein Problem.

+0

Danke für die Info. – ains