Warum ist std :: atomic & lt; bool & gt; viel langsamer als volatile bool?
Habe ich mit volatile bool seit Jahren für die Ausführung des Threads Kontrolle und es funktionierte gut
//in my class declaration
volatile bool stop_;
-----------------
//In the thread function
while (!stop_)
{
do_things();
}
Nun, da c++11-Unterstützung für Atomare Operationen, die ich beschlossen, zu versuchen, statt
//in my class declaration
std::atomic<bool> stop_;
-----------------
//In the thread function
while (!stop_)
{
do_things();
}
Aber es ist um mehrere Größenordnungen langsamer als die volatile bool
!
Einfacher Testfall die ich geschrieben habe, dauert etwa 1 Sekunde, um mit volatile bool
Ansatz. Mit std::atomic<bool>
allerdings warte ich schon seit über 10 Minuten und gab auf!
Habe ich versucht zu verwenden memory_order_relaxed
Flagge mit load
und store
den gleichen Effekt.
Meine Plattform:
Windows 7 64-bit
MinGW gcc 4.6.x
Was ich falsch mache?
UPD
Ja, ich weiß, dass die flüchtigen nicht stellen Sie eine thread-sichere variable. Meine Frage ist nicht zu flüchtig, es geht darum, warum atomic ist lächerlich langsam.
UPD2
@alle, vielen Dank für Ihre Kommentare - ich werde versuchen, all das schlug mich, wenn ich meine Maschine heute Abend.
volatile
wirklich tut. volatile
nicht die Dinge machen, thread-sicher, noch ist es eine Atomare operation. assert(your_atomic_variable.is_lock_free())
? volatile
durch Zufall geschieht, um speichern und laden von atomic auf x86. InformationsquelleAutor der Frage | 2012-10-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Code von "Olaf Dietsche"
WENN SIE GCC VERWENDEN, KLEINERE 4.7
http://gcc.gnu.org/gcc-4.7/changes.html
Also ja .. einzige Lösung ist ein upgrade auf GCC 4.7
InformationsquelleAutor der Antwort KoKuToru
Da bin ich neugierig, das ich es selber getestet auf Ubuntu 12.04, AMD 2.3 GHz, gcc 4.6.3.
Zusammengestellt
g++ -g -std=c++0x -O3 a.cpp
Obwohl, gleichen Schluss wie @aleguna:
nur
bool
:volatile bool
:std::atomic<bool>
:std::atomic<int>
:InformationsquelleAutor der Antwort Olaf Dietsche
Meine Vermutung ist, dass dies eine hardware-Frage.
Wenn Sie schreiben, der flüchtig Sie sagen, dass der compiler nicht davon ausgehen, etwas über die variable, aber wie ich es verstehe, wird die hardware immer noch behandeln Sie es wie eine normale variable. Dies bedeutet, dass die variable wird in den cache die ganze Zeit.
Wenn Sie atomic, die Sie verwenden speziellen hardware-Anweisungen, die wahrscheinlich bedeutet, dass die variable fetch aus Hauptspeicher jedes mal, wenn es verwendet wird.
Der Unterschied im timing ist im Einklang mit dieser Erklärung.
InformationsquelleAutor der Antwort Olle Lindeberg