【发布时间】:2016-02-21 09:14:13
【问题描述】:
问题在于 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 实现的怪癖。
谢谢
【问题讨论】:
-
那是我的错,请忽略。该示例是从内存中编写的。这些值在 CAS 之前由调试器进行比较。已更新。
-
嗯,好的。该库的实现只是遵循编译器内在函数
__atomic_compare_exchange,所以我怀疑这是一个库问题。 -
我认为您错误地调用了
memcmp- 参数已经是指向比较数据的指针,为什么要将它们作为指针传递?