我正在阅读Anthony Williams的"行动中的C++并发"和第5章,其中讨论了新的多线程感知内存模型和原子操作,并指出:
为了
std::atomic<UDT>用于某些用户定义的UDT类型,此类型必须具有普通的复制赋值运算符.
据我了解,这意味着std::atomic<UDT>如果以下内容返回true ,我们可以使用:
std::is_trivially_copyable<UDT>::value
Run Code Online (Sandbox Code Playgroud)
通过这种逻辑,我们不应该使用它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;
}
Run Code Online (Sandbox Code Playgroud)
这是一个未定义的行为,恰好按预期行事吗?
提前致谢!