原子操作atomic

C++中有atomic类和atomic_flag两个类,其中atomic类用于定义一个原子操作,atomic_flag定义一些与原子操作相关的函数

如下操作:

// atomic原子操作.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <atomic>
#include <iostream>
#include <thread>
using namespace std;

//atomic<int> N = 0;
int N = 0;

void threadFun()
{
	for (int i = 0; i < 1000000; ++i)
		++N;
}

int main()
{
	thread t1(threadFun);
	thread t2(threadFun);
	t1.join();
	t2.join();
	cout << N << endl;
	return 0;
}

一般的操作如上,我们开启两个线程,定义一个全局变量N,定义一个线程函数,想要执行的功能是没执行一次函数就让全局变量N加1,每个线程单独加1000000次,两个线程,我们期望的结果是2000000,但是结果如上图所示,多次实验结果不一样,但是总不会(概率很小)出现我们期望的结果,这是因为,我们对变量N的操作是非原子性的,线程A执行++的时候,线程B也在执行++,有可能两个线程是对同一个值进行相同的++操作,这样最后得出的结果就是执行了一次++操作,所以最后结果会小于200000,。

我们把N定义成一个原子变量,即在N上的操作是具有原子性的,每个线程在执行++操作是不会被另一个线程打断,只有++执行完毕另一个线程才会执行自己的++动作

// atomic原子操作.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <atomic>
#include <iostream>
#include <thread>
using namespace std;

atomic<int> N = 0;//定义N为原子变量
//int N = 0;

void threadFun()
{
	for (int i = 0; i < 1000000; ++i)
		++N;
}

int main()
{
	thread t1(threadFun);
	thread t2(threadFun);
	t1.join();
	t2.join();
	cout << N << endl;
	return 0;
}

我们把N定义为atomic<int> 类的一个对象,使得在N上的操作具有原子性,如此我们得到的结果就是所期望的值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值