尽管数据与预期值匹配,但compare_exchange_strong失败

compare_exchange_strong failing despite data matching expected value

本文关键字:compare exchange 失败 strong 数据      更新时间:2023-10-16

问题在于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 字节,它们都用于表示实际值(没有填充位)。

看完这个答案就看到了问题,可能更详细。