【发布时间】:2017-07-27 09:02:43
【问题描述】:
我有以下代码:
#include<atomic>
#include<iostream>
using namespace std;
struct Big{
int i;
int j;
int k[100];
};
int main(){
atomic<int> i;
cout<<i.load()<<endl;
i.store(20);
cout<<i.load()<<endl;
i.exchange(30);
cout<<i.load()<<endl;
atomic<Big> ab,expect,value;
ab.compare_exchange_weak(expect,value,memory_order_release,memory_order_relaxed);//error
return 0;
}
好吧,原子的效果很好,但我想看看 compare_exchange_weak 的非锁定功能是否适用于复杂的数据结构。用 --std=c++11 编译它给了我:
error: no matching member function for call to 'compare_exchange_weak'
ab.compare_exchange_weak(expect,value,memory_order_release,memory_order_relaxed);
~~~^~~~~~~~~~~~~~~~~~~~~
candidate function not viable: no known conversion from 'atomic<Big>' to 'Big &' for 1st argument
bool compare_exchange_weak(_Tp& __e, _Tp __d,
所以我的问题:
std::atomic::compare_exchange_weak 是否适用于复杂结构?
如果 intel cpu 硬件 CMPEXG 只能在 64 位长度的缓存行中工作,那么大于 8 字节的结构是否可以与 CMPEXG 一起工作?还是原子操作吗?
如何修复我的程序?
谢谢。
【问题讨论】:
标签: c++ multithreading c++11 atomic