Anthony Williams の「C++ Concurrency in Action」と、新しいマルチスレッド対応メモリ モデルとアトミック操作について説明している第 5 章を読んでいて、彼は次のように述べています。
std::atomic<UDT>
一部のユーザー定義で使用するにはUDT
、この型に自明なコピー代入演算子が必要です。
私が理解しているように、これはstd::atomic<UDT>
、以下が true を返す場合に使用できることを意味します。
std::is_trivially_copyable<UDT>::value
このロジックでは、 をstd::string
テンプレート引数として使用してstd::atomic
正しく動作させることはできません。
ただし、次のコードはコンパイルおよび実行され、期待される出力が得られます。
#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;
}
これは、たまたま期待どおりに動作する未定義の動作の場合ですか?
前もって感謝します!