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

Posted u012507022

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++11多线程 原子操作概念及范例相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

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

以上是关于C++11多线程 原子操作概念及范例的主要内容,如果未能解决你的问题,请参考以下文章

C++11多线程第一篇:并发基本概念及实现,进程线程基本概念

多线程的概念及实现

iOS多线程总结——多线程相关概念及NSObject/NSThread的使用

第三章--Win32程序的执行单元(部分概念及代码讲解)(上 -- 多线程)

线程概念及多线程控制

事务的概念及特性