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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值