cppreference.com dokumentiert diese Funktion als "Zaun zwischen einem Thread und einem Signal-Handler, der im selben Thread ausgeführt wird". Aber ich habe im Internet kein Beispiel gefunden.
Ich frage mich, ob der folgende Pseudo-Code die Funktion von std::atomic_signal_fence()
korrekt darstellt:
Nein, Ihr Code zeigt nicht die korrekte Verwendung von atomic_signal_fence
. Wie Sie cppreference.com angeben, führt atomic_signal_fence
nur die Synchronisation zwischen einem Signalhandler und anderem Code aus, der auf demselben Thread ausgeführt wird. Das bedeutet, dass keine Synchronisation zwischen zwei verschiedenen Threads durchführt. Ihr Beispielcode zeigt zwei verschiedene Threads.
Die C ++ - Spezifikation enthält die folgenden Hinweise zu dieser Funktion:
Hinweis: Compiler-Optimierungen und Umordnungen von Lasten und Speichern werden auf die gleiche Weise wie bei
atomic_thread_fence
gesperrt, aber die Hardware-Zaunbefehle, die atomic_thread_fence eingefügt hätte, werden nicht ausgegeben.Hinweis:
atomic_signal_fence
kann verwendet werden, um die Reihenfolge anzugeben, in der vom Thread ausgeführte Aktionen für den Signalhandler sichtbar werden.
Hier ist ein Beispiel für korrekte, wenn nicht motivierende Verwendung:
%Vor%Die Behauptung, wenn sie auftritt, ist garantiert wahr.
In Ihrem Beispiel möchten Sie std :: atomic_thread_fence verwenden (das Maschinencode generiert, um die Thread-Synchronisation durchzuführen); nicht std :: atomic_signal_fence (wodurch nur die Optimierungen der Compilerspeicheraufzeichnung für atomare Variablen deaktiviert werden). Wie von anderen gesagt wurde, ist std :: atomic_signal_fence nur für Signale auf demselben Thread wie die atomaren Operationen gedacht (ich glaube, dass dies auch für strukturierte / vektorisierte Exception-Handler unter Windows gelten würde, aber zitieren Sie mich nicht dazu).
Tags und Links c++ multithreading c++11 performance atomic