我正在阅读 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;
}
这是一种未定义行为的情况,只是恰好按预期运行吗?
提前致谢!