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.

Kommentar zu dem Problem
Sie sind Missverständnis, was volatile wirklich tut. volatile nicht die Dinge machen, thread-sicher, noch ist es eine Atomare operation. Kommentarautor: Mysticial
assert(your_atomic_variable.is_lock_free())? Kommentarautor: R. Martinho Fernandes
Der alte code ist falsch, es "geklappt" durch Zufall. Was ist besser: korrigieren oder zu schnell? Kommentarautor: Dietrich Epp
Bitte posten Sie Ihre einfachen Testfall (wenn Sie wollen sinnvolle Kommentare). Kommentarautor: CB Bailey
@Mysticial: Leider volatile durch Zufall geschieht, um speichern und laden von atomic auf x86. Kommentarautor: Jan Hudec

InformationsquelleAutor der Frage | 2012-10-30

Schreibe einen Kommentar