c++ - 尽管数据匹配预期值,但 compare_exchange_strong 失败

标签 c++ c++11 icc stdatomic

问题在于 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;
};

因为 long long 在我的机器上是 8 个字节,所以这个版本有 16 个字节大小,它们都用来表示实际值(没有填充位)。

看了之后才发现问题this答案,可能会更详细。

关于c++ - 尽管数据匹配预期值,但 compare_exchange_strong 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35534305/

相关文章:

c++ - 从 int[] 转换为 list<int> : Any better way

c++ - 为什么不从不同的继承分支覆盖纯虚方法?

c++ - 英特尔编译器无法识别来自 gcc 的 avxintrin.h 的标识符

c++ - 无限无符号整数链表实现。减法不起作用

c++ - 无法在 Boost.Log 中设置控制台日志的格式

c++11:clang 在我的模板定义中拒绝 numeric_limits<>,而 gcc 接受它 - 这是正确的吗?

c++ - icc:包括 omp.h 需要 byteswap.h

c++ - 三元 vector 的快速内积

c++ - 链表反转

c - #pragma unroll(0) 和#pragma unroll(1) 有区别吗?