2010-03-19 5 views
69

Von was ich gelesen habe Herb Sutter und others Sie würden denken, dass volatile und gleichzeitige Programmierung vollständig orthogonale Konzepte waren, zumindest soweit C/C++ betroffen sind.Warum wird der flüchtige Qualifier durch std :: atomic verwendet?

In GCC implementation haben jedoch alle Mitgliedsfunktionen des Elements volatile den Namen std::atomic. Das gleiche gilt für Anthony Williams implementation von std::atomic.

Also was ist Deal, müssen meine atomic<> Variablen volatile oder nicht sein?

+0

+1 Mr.Williams ist hier auf SO, vielleicht kann er auftauchen und eine Antwort geben :) – AraK

+1

Ich habe eine Frage über comp.std.C++ darüber gesehen. Denken Sie daran, dass "flüchtige" Garanten, die in einem einzelnen Thread lesen und schreiben, der Reihe nach ausgeführt werden und dass ein flüchtiges Objekt keine nichtflüchtigen Elementfunktionen aufrufen kann (genau wie const). Aber darüber hinaus habe ich keine Ahnung von Threads in C++. Jedes Mal, wenn ich versuche, im Standard darüber zu lesen, beginne ich damit, die schiere Menge an Umleitungen und Logiken im Text nicht zu erfassen. XD –

Antwort

55

Warum ist die volatile Qualifier im gesamten std::atomic verwendet?

Damit flüchtige Objekte auch atomar sein können. Siehe here:

Das entsprechende Angebot ist

Die Funktionen und Operationen definiert sind, mit flüchtigen Objekten zu arbeiten, so dass Variablen, die flüchtig sein sollten auch atomar sein kann. Der volatile Qualifier ist jedoch für die Atomarität nicht erforderlich.

Sie meine atomic<> Variablen volatile oder nicht sein müssen?

Nein, atomare Objekte müssen nicht flüchtig sein.

+0

Hinweis: Dies ist technisch identisch mit dem plattformspezifischen http: // stackoverflow .com/questions/3708160/what-is-the-effect-of-interlockedincrement-Argument-deklariert-as-volatile – Suma

+0

Der flüchtige Qualifier wird verwendet, um eine Neuordnung zu verhindern. Das ist es, was es macht. –

15

Als const ist flüchtig transitiv. Wenn Sie eine Methode als volatile deklarieren, können Sie keine nichtflüchtige Methode für sie oder eines ihrer Elementattribute aufrufen. Mit std::atomic Methoden volatile erlauben Sie Aufrufe von volatile Member-Methoden in Klassen, die die std::atomic Variablen enthalten.

Ich bin nicht einen guten Tag ... so verwirrend ... vielleicht ein kleines Beispiel hilft:

struct element { 
    void op1() volatile; 
    void op2(); 
}; 
struct container { 
    void foo() volatile { 
     e.op1(); // correct 
     //e.op2(); // compile time error 
    } 
    element e; 
}; 
75

Um zusammenzufassen, was andere richtig geschrieben haben:

C/C++ volatile ist für Hardwarezugriff und Interrupts. C++ 11 atomic<> dient zur Kommunikation zwischen den Threads (z. B. im Lock-Free-Code). Diese beiden Konzepte/Anwendungen sind orthogonal, aber sie haben sich überschneidende Anforderungen und deshalb haben die Leute die beiden oft verwirrt.

Der Grund, dass atomic<> flüchtige qualifizierte Funktionen hat, ist der gleiche Grund, es const qualifizierten Funktionen hat, weil es im Prinzip möglich ist, für ein Objekt sowohl atomic<> sein und auch const und/oder volatile.

Natürlich, wie mein Artikel wies darauf hin, eine weitere Quelle der Verwirrung ist, dass C/C++ volatile ist nicht die gleiche wie C#/Java volatile (letzteres ist grundsätzlich äquivalent zu C++ 11 atomic<>).

+2

Ich werde die Tatsache missbrauchen, dass Sie hier sind, um Ihre Meinung zu einem Artikel von Alexandrescu zu lesen, der das Flag "volatile" verwendet, um Fehler bei der Kompilierung von Thread-unsicherem Code zu erzeugen die Schnittstelle und 'const_cast' zum Entfernen der flüchtigen, wenn ein Mutex erworben wird). Könnte es Sinn machen, einen Typ-Qualifier 'threadsafe' oder ähnliches für diesen Zweck in der Sprache hinzuzufügen (ich denke gerade laut nach) Der Artikel ist hier: http://www.drdobbs.com/cpp/184403766;jsessionid=OEWBPI10M2IQLQE1GHPCKHWATMY32JVN –

+0

Ich habe es als Frage hier hinzugefügt: http://StackOverflow.com/Questions/2491495 –

+10

In einigen von Andrejs Artikeln, was er wirklich tat, war , um das flüchtige Schlüsselwort zu entführen (äh, ich meine, "wiederverwenden") als handliches meist unbenutztes tag im typsystem konnte er als hook zu überladen und andere effekte bekommen, was ein wenig verwirrend war, weil es nicht ganz so hieß. –

Verwandte Themen