I durch Anthony Williams lese "C++ Concurrency in Action" und in Kapitel 5, die über das neue Multithreading-fähiges Speichermodell und atomare Operationen sprechen, und er sagt: fürFunktioniert std :: atomic <std::string> richtig?
Um
std::atomic<UDT>
zu verwenden einige benutzerdefinierteUDT
, muss dieser Typ einen trivialen Kopie Zuweisungsoperator haben.
Wie ich es verstehe, bedeutet dies, dass wir std::atomic<UDT>
, wenn die folgenden true zurück verwenden können:
std::is_trivially_copyable<UDT>::value
Nach dieser Logik sollten wir nicht in der Lage sein std::string
als Template-Argument zu verwenden, für std::atomic
und habe es richtig funktionieren.
jedoch der folgende Code kompiliert und läuft mit erwarteten Ausgang:
#include <atomic>
#include <thread>
#include <iostream>
#include <string>
int main()
{
std::atomic<std::string> atomicString;
atomicString.store("TestString1");
std::cout << atomicString.load() << std::endl;
atomicString.store("TestString2");
std::cout << atomicString.load() << std::endl;
return 0;
}
Ist dies ein Fall von undefiniertem Verhalten, das passiert einfach wie erwartet zu verhalten?
Vielen Dank im Voraus!
Was ist Ihr Compiler (und Ihre Implementierung der Stdlib)? Ich konnte es nicht Compiler machen [hier] (http://coliru.stacked-crooked.com/view?id=0ce3b66093e9a0a59d5179429373eea7-e54ee7a04e4b807da0930236d4cc94dc), und das ist tatsächlich, was ich erwartet wurde –
@AndyProwl Ich benutze VS 2012 bei der Moment, ohne den November CTP. –
Wie Sie es verwenden, würde ich nicht erwarten, ein Problem zu sehen. Das Problem würde auftreten, wenn zwei (oder mehr) Threads versuchten, dieselbe Zeichenfolge gleichzeitig zu ändern. Zu diesem Zeitpunkt würde der nicht-triviale Operator von "string" anfangen, ein Problem zu verursachen. Wenn man etwas in "std :: atomic" einpackt, ist es wahrscheinlich nicht möglich, Code zu brechen, der ohne ihn in Ordnung wäre. Zur gleichen Zeit, ohne seinen Regeln zu folgen, wird es Code nicht helfen, der ohne es gebrochen würde. –