问题在于compare_exchange_strong
返回 false,尽管基础数据等于expected
. 例如:
std::atomic<data> ptr;
...
auto ptr_data = ptr.load();
bool cmp_result = memcmp(&ptr_data, &expected, sizeof(ptr_data));
bool cas_result = ptr.compare_exchange_strong(expected, desired);
assert(cas_result || !cmp_result);
data
是一个 128 位的 POD。ptr.is_lock_free()
返回真。这是以单线程方式测试的。cas_result
永远是假的,cmp_results
永远是真的。
编译使用 Intel 的 C++ 编译器,版本 16 更新 2。在 Linux 上,libstdc++ 版本 5.3.1。64 位二进制。
完全相同的代码在 Windows 上编译时可以正常工作,具有相同的 ICC16,但作为 32 位代码。这让我相信这是 stdlib 实现的怪癖。
谢谢