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;
补充:
- 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
以上是关于C++11多线程 原子操作概念及范例的主要内容,如果未能解决你的问题,请参考以下文章
C++11多线程第一篇:并发基本概念及实现,进程线程基本概念
iOS多线程总结——多线程相关概念及NSObject/NSThread的使用