尽管数据匹配期望值

时间:2016-02-21 09:14:14

标签: c++ c++11 icc stdatomic

问题是compare_exchange_strong返回false,尽管基础数据等于expected。 e.g:

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始终为false,cmp_results始终为真。

使用英特尔的C ++编译器进行编译,版本16更新2.在Linux上,libstdc ++版本5.3.1。 64位二进制。
在Windows上编译时使用的代码完全相同,使用相同的ICC16但是32位代码。这让我相信这是stdlib实现的怪癖。

谢谢

1 个答案:

答案 0 :(得分:1)

我在使用的结构上也遇到过这种情况。我认为这是由于对齐问题而插入填充位以及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答案后,我看到了问题,这可能会更详细。