C++11多线程 原子操作概念及范例

x33g5p2x  于2022-03-06 转载在 其他  
字(1.2k)|赞(0)|评价(0)|浏览(336)

互斥量:多线程编程中保护共享数据:先锁,操作共享数据,开锁

大家可以把原子操作理解成一种:不需要用到互斥量加锁(无锁)技术的多线程并发编程方式;

原子操作:是在多线程中不会被打断的程序片段;原子操作比互斥量更胜一筹;

互斥量的加锁一般针对一个代码段,原子操作针对的一般都是一个变量,而不是一个代码段。

原子操作,一般都是指“不可分割的操作”,也就是说这种操作状态要么是完成的,要么是没完成的,不可能出现半完成状态。

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;
}

补充:

  1. load():以原子方式读atomic对象的值
  2. 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

相关文章