C ++ 11:确实是atomic :: compare
我有以下代码:
#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位长度的高速缓存行中工作,那么对于CMPEXG,结构是否大于8个字节? 它仍然是原子操作吗?
如何解决我的计划?
谢谢。
std :: atomic :: compare_exchange_weak是否可以处理复杂的结构?
是的,但是有些条件包括可复制的和可以构造的。
如果intel cpu硬件CMPEXG只能在64位长度的高速缓存行中工作,那么对于CMPEXG,结构是否大于8个字节?
不,它不会那样工作。 如果你创建了一个疯狂的大型结构,那么你的代码将不会“无锁”。 你的编译器会发布总线锁来确保线程安全,这就是为什么你永远不应该做你在那里用大数据结构做的事情。 如果不是更多,你会减慢你的程序数百次。 考虑原子交换指针。
它仍然是原子操作吗?
不,它使用锁。 你可以用std::atomic::is_lock_free()
来测试它
如何解决我的计划?
你去那里:
#include <atomic>
#include <iostream>
using namespace std;
struct Big {
int i;
int j;
int k[100];
};
int main() {
Big value, expect;
atomic<Big> ab;
ab.compare_exchange_weak(expect, value);
return 0;
}
链接地址: http://www.djcxy.com/p/78223.html
上一篇: C++11: does atomic::compare
下一篇: safe increment with modulo without mutex using std::atomic