Wie verwende ich richtig std :: atomic_signal_fence ()?

8

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:

%Vor%     
xmllmx 29.01.2013, 10:46
quelle

2 Antworten

16

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.

    
bames53 29.01.2013, 23:32
quelle
2

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).

    
nfries 18.03.2013 04:13
quelle