尽管数据与预期值匹配,但compare_exchange_strong失败
compare_exchange_strong failing despite data matching expected value
问题在于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()
返回 true。这是以单线程方式测试的。 cas_result
总是假的,cmp_results
永远是真的。
编译使用英特尔的C++编译器版本 16 更新 2 完成。在 Linux 上,libstdc++ 版本 5.3.1。64 位二进制文件。
完全相同的代码在Windows上编译时可以正常工作,使用相同的ICC16,但作为32位代码。这让我相信这是 stdlib 实现的怪癖。
谢谢
我在
使用的结构上也遇到过这种情况。我认为这是由于对齐问题以及compare_exchange对两个值进行按位比较而插入的填充位引起的。
在我的机器上,单词/指针大小为 8 字节,我的结构是这样的:
struct s {
int i;
void *ptr;
};
它只使用 12 个字节来表示其内容(PTR 是 8 个字节,int 是 4),但它的大小是 16 个字节(sizeof(s) == 16)。我所做的是将结构更改为:
struct s {
long long i;
void *ptr;
};
因为长长在我的机器上是 8 字节,所以这个版本的大小为 16 字节,它们都用于表示实际值(没有填充位)。
看完这个答案就看到了问题,可能更详细。
相关文章:
- 禁用/覆盖 -werror=sign-compare
- std::set<Key,Compare,Allocator>::find() 函数使用"<"运算符而不是"=="运算符背后的直觉是什么?
- 为什么我需要包含<compare>标头才能编译 <=>?
- 我应该移动 std::exchange ed 成员吗?
- s.compare 成员函数在下面的C++代码中的行为如何?
- C++有"not equal compare and exchange"或"fetch add on not equal"吗?
- 为什么 .compare 返回 1?
- std::string::compare(const char*) 会抛出异常吗?
- 关于 C++ 中的'compare'函数
- C++ 使用比较 - '.compare'左侧必须具有类/结构/联合
- 常量表达式中的非文本类型'compare'
- 为什么std::exchange不是noexcept
- 有什么理由为什么“std::exchange”不是“constexpr”
- 我的std::exchange不在命名空间std中
- 用自制的"std::Compare"初始化"std::priority_queue&quo
- 如何使用Exchange Web服务使用C 与GSOAP一起阅读Outlook的电子邮件
- std::使用本地类型Compare进行排序
- std::swap vs std::exchange vs swap operator
- Java相当于C++的字符串::compare()方法
- 字符串compare何时停止比较?(标准)