1、Atomic
C++11中提供了一系列的原子操作,atomic提供了常见的原子操作方法:
- store 原子写操作,可以类比是赋值操作
std::atomic<int> tem;
tem.store(10);
- load 原子读操作,可以类比读取
std::cout<<"tem"<<tem.load()<<std::endl;
- exchange 原子改变操作 a. exchange(b) 会把b的值赋值给a。
std::atomic<int> tem;
tem.store(10);
std::atomic<int> tem1;
tem1.store(30);
tem.exchange(tem1);
std::cout<<"tem:"<<tem<<" tem1:"<<tem1<<std::endl; //tem:30 tem1:30
- compare_exchange_weak/compare_exchange_strong (是著名的CAS(compare and set))。
参数传入期待值与新值,通过比较当前值与期待值的情况进行区别改变。
a.compare_exchange_weak(b,c)其中a是当前值,b期望值,c新值
a==b时:函数返回真,并把c赋值给a
a!=b时:函数返回假,并把a复制给b
int main() //相等案例
{
std::atomic<int> a;
a.store(10);
int b=10; //a==b
int c=20;
std::cout<<"a:"<<a<<std::endl;
if(a.compare_exchange_weak(b,c))
{
std::cout<<"a true:"<<a.load()<<std::endl;
}
std::cout<<"a:"<<a<<" b:"<<b<<" c:"<<c<<std::endl;
return 0;
}
a:10
a true:20
a:20 b:10 c:20
int main() //不等案例
{
std::atomic<int> a;
a.store(10);
int b=100; //a!=b
int c=20;
std::cout<<"a:"<<a<<std::endl;
if(a.compare_exchange_weak(b,c))
{
std::cout<<"a true:"<<a.load()<<std::endl;
}
std::cout<<"a:"<<a<<" b:"<<b<<" c:"<<c<<std::endl;
return 0;
}
a:10
a:10 b:10 c:20
compare_exchange_weak比compare_exchange_strong的性能更高一些,常在循环中使用。