互斥量:多线程编程中保护共享数据:先锁,操作共享数据,开锁
大家可以把原子操作理解成一种:不需要用到互斥量加锁(无锁)技术的多线程并发编程方式;
原子操作:是在多线程中不会被打断的程序片段;原子操作比互斥量更胜一筹;
互斥量的加锁一般针对一个代码段,原子操作针对的一般都是一个变量,而不是一个代码段。
原子操作,一般都是指“不可分割的操作”,也就是说这种操作状态要么是完成的,要么是没完成的,不可能出现半完成状态。
std::atomic来代表原子操作,std::atomic是个模板。其实std::atomic这个东西是用来封装某一个类型的值的;多线程中一般用于计数,或者统计。
原子操作std::atomic续谈
一般atomic原子操作,针对++、--、&=、|=是支持的。其他的可能不支持;
实例代码如下:
#include<iostream>
#include<thread>
#include<string>
#include<vector>
#include<list>
#include<mutex>
#include<future>
using namespace std;
//我们封装了一个类型为int的对象,像操作一个int类型变量一样来操作这个g_mycont
std::atomic<int> g_mycont = 0;
void mythread()
{
for (int i = 0; i < 1000000; i++)
{
//g_mycont++;//对应的操作是个原子操作(不会被打断)
//g_mycont += 1;
g_mycont = g_mycont + 1; //结果不对,不是原子操作
}
}
int main()
{
thread myobj(mythread);
thread myobj2(mythread);
myobj.join();
myobj2.join();
cout << "两个线程执行完毕,最终的g_mycont的结果是:" << g_mycont <<endl;
return 0;
}
补充:
- load():以原子方式读atomic对象的值
- store():以原子方式写入内容
atomic<int> atm;
atm = 0;
cout << atm << endl; //读原atm是原子操作子,但是整个这一行代码并不是原子操作
auto atm2(atm.load());//以原子方式读atomic对象的值
atm.store(12);//以原子方式写入内容
注:该文是C++11并发多线程视频教程笔记,详情可学习:https://study.163.com/course/courseMain.htm?courseId=1006067356