2017-03-29 3 views
2

[Nachstehend wird C++ Begriffe]

Ich habe ein Faden A und B Gewinde, die den Zugriff auf den ganzzahligen Wert P. Thread A diesen Wert initialisiert und aktualisiert sie während des Laufens. Dann wird Thread A vervollständigt. Thread B wartet darauf, dass Thread A abgeschlossen wird (Standard-OS-API-Aufruf, welches Betriebssystem auch immer verwendet wird) und möchte P lesen.
Erfordert Thread B eine Speicherbarriere zum Lesen eines kohärenten, zuletzt durch Thread A gesetzten Werts von P? Gibt es eine Möglichkeit, dass, wenn die OS-API "Thread A beendet" sagt, die Änderungen des Speichers, die geändert wurden, für andere Threads noch nicht sichtbar sind?

Beachten Sie, dass es nur ein Thread hier den Wert zu schreiben, die oder vor von „Is there an implicit memory barrier with synchronized-with relationship on thread::join?“, fragte diese Frage nicht unterscheiden kann. Mein Bauchgefühl sagt mir, dass die Antwort gleich sein sollte, aber ...Benötige ich eine Speicherbarriere für den Zugriff auf den Speicher, der vom beendeten Thread geändert wurde?

+1

Das klingt nach einem Job für 'std :: future. –

+0

Von lesen [this] (https://timsong-cpp.github.io/cppwp/thread.thread.member#4), würde ich sagen, dass ja - .join() synchronisiert, und Sie brauchen nicht eine Speicherbarriere. Aber dieser Text ist nicht für normale Sterbliche gedacht, um ihn zu interpretieren, also überlasse ich die Antwort jemand anderem. Vielleicht auch ein Duplikat von http://stackoverflow.com/questions/12444891/are-memory-barriers-required-when-joining-on-a-thread?rq=1 – nos

Antwort

1

join synchronisiert mit dem Thread, der join aufruft. Das heißt, alle Schreibvorgänge, die A machen, werden für B sichtbar, wenn BA.join() ruft.

Sie können als Astd::atomic_thread_fence(memory_order_release) Ausführung daran denken, wie es endet und B Ausführung std::atomic_thread_fence(std::memory_order_acquire als A verbindet.

Does Thread B benötigen eine Speicherbarriere

Ja, aber sie sind implizit in join und Sie müssen nicht, sie zu schreiben.

Gibt es eine Möglichkeit, dass, wenn OS-API sagt "Thread A beendet", die Änderungen des Speichers, die es modifiziert, für andere Threads noch nicht sichtbar sind?

Andere Threads als der Aufrufer von join benötigen zusätzliche Synchronisation, z. std::condition_variable oder std::atomic_thread_fence(std::memory_order_acquire);

Verwandte Themen