Lassen Sie uns sagen, ich habe zwei Arrays:Zugriff auf Array von mehreren Threads
int[] array1 = new int[2000000];
int[] array2 = new int[2000000];
ich einige Werte in den Arrays bleiben und wollen dann den Inhalt von array2 hinzuzufügen wie so Array1:
for(int i = 0; i < 2000000; ++i) array1[i] += array2[i];
Nehmen wir an, ich möchte die Verarbeitung auf einem Multi-Prozessor-Rechner beschleunigen. Anstatt nur eine Schleife wie oben zu erstellen, erstelle ich zwei Threads. Eine davon habe ich die ersten 1000000 Elemente im Array verarbeiten, die andere habe ich die letzten 1000000 Elemente im Array verarbeiten. Mein Hauptthread wartet auf diese beiden Threads, um sie darüber zu informieren, dass sie fertig sind, und fährt dann fort, die Werte von array1 für alle Arten wichtiger Dinge zu verwenden. (Beachten Sie, dass die beiden Worker-Threads möglicherweise nicht beendet werden und wiederverwendet werden können, aber der Hauptthread wird erst fortgesetzt, wenn beide dies gemeldet haben.)
Meine Frage lautet also: Wie kann ich sicher sein? Der Haupt-Thread wird die Änderungen sehen, die die beiden Worker-Threads an das Array vorgenommen haben. Kann ich darauf vertrauen, dass dies geschieht, oder muss ich eine spezielle Prozedur durchlaufen, um sicherzustellen, dass die Worker-Threads ihre Schreibvorgänge in das Array leeren und der Hauptthread seine zwischengespeicherten Array-Werte verwirft?
Vorausgesetzt, dass er plant, auf den Haupt-Thread (aus der Beschreibung) zu blockieren, sollte die Speicherbarriere unnötig sein. –
Er hat nicht explizit gesagt, wie er gewartet hat (es könnte eine Weile dauern (! Fertig) {}). Jede vernünftige Art zu warten erfordert keine Barriere. – Michael
Ich verwende ManualResetEvent-Objekte, damit der Hauptthread Worker-Threads signalisiert und umgekehrt. Ich war irgendwie neugierig auf die Funktionalität von MemoryBarrier, da ich schon daran gearbeitet habe. Die Dokumente von MS sagen sehr wenig darüber aus und sagen im Grunde genommen, dass es die Neuanordnung von Anweisungen verhindert. Ich hatte den Eindruck, dass es den aktuellen Thread Cache geleert/geleert hat, aber nie sicher wusste. (Wenn dies der Fall ist, könnten die Worker auch ohne echte Thread-Synchronisation MemoryBarrier aufrufen und dann, wenn der Hauptthread später SpeicherBarrier genannt wird, würde es die Änderungen am Array sehen, nicht wahr?) – nonoitall