[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?
Antwort
join
synchronisiert mit dem Thread, der join
aufruft. Das heißt, alle Schreibvorgänge, die A
machen, werden für B
sichtbar, wenn B
A.join()
ruft.
Sie können als A
std::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);
- 1. Warum brauche ich eine Speicherbarriere?
- 2. Muss ich den Zugriff auf eine Liste synchronisieren, die nur von einem Thread geändert wird?
- 3. Zugriff auf den physikalischen Speicher über eine Hochsprache, z.
- 4. Python beendeten Thread kann nicht neu starten
- 5. den Wert für den Zugriff auf eine Klasse
- 6. Wie setze ich den Namen für den Thread?
- 7. SAPUI5 Datenbindung den Wert erhalten, der im Änderungsereignis geändert wurde
- 8. Excel 2010 Der Zugriff auf den Pfad wurde verweigert. Temp
- 9. Zugriff auf den Optionsfeldwert, der mit ng-repeat erstellt wurde
- 10. Der Zugriff auf den Registrierungsschlüssel 'Global' wurde verweigert
- 11. Werkzeuge für den lokalen Speicher
- 12. Kann C-Compiler den Zugriff auf nicht zugeordneten Speicher optimieren?
- 13. Zugriff auf einen Socket, der an Thread übergeben wurde
- 14. Statische Klasse für den Zugriff auf Sitzung
- 15. Benötige ich Schrägstriche vor den Links?
- 16. Java für den Zugriff auf PCI-Modem
- 17. So stellen Sie den Speicher für den Behälter einer Garnanwendung ein, der sich vom Anwendungsstamm unterscheidet
- 18. Den Zugriff auf den Ordner verweigern, aber den Zugriff auf eine Datei in diesem Ordner zulassen
- 19. Zugriff auf den globalen Speicher in CUDA ist langsam
- 20. Zugriff auf den Variablennamen
- 21. Wie benötige ich keine Autorisierung für den Index?
- 22. Gibt es eine implizite Speicherbarriere mit synchronisierten Beziehungen auf Thread :: Join?
- 23. Benötige ich den sbt scala-Paket-Generator für Pyspark-Skripte?
- 24. Zugriff auf den ASP.NET-Cache von einem separaten Thread?
- 25. C# - Daten vom ThreadPool-Thread an den Hauptthread zurückgeben
- 26. Begrenzen der Singleton-Instanz auf den Thread
- 27. Benötige ich ein Thread Lock-Objekt?
- 28. Legt der Compiler Speicher auf den Heapspeicher?
- 29. Keycode-Authentifizierung für den Zugriff auf Webapp
- 30. Zugriff auf den lokalen node.js-Server vom iOS-Emulator?
Das klingt nach einem Job für 'std :: future. –
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