广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++11原子操作详解
  • 843
分享到

C++11原子操作详解

2024-04-02 19:04:59 843人浏览 安东尼
摘要

目录c++11原子操作原子操作的概念示例总结C++11原子操作 原子操作的概念 所谓原子操作,其意义就是“原子是最小的,不可分割的最小个体”。**表示当多个线程访问同一个全局资源的时

C++11原子操作

原子操作的概念

所谓原子操作,其意义就是“原子是最小的,不可分割的最小个体”。**表示当多个线程访问同一个全局资源的时候,能够确保所有其它的线程都不在同一时间访问相同的资源。**也就是它确保在同一时刻只有唯一的线程对这个资源进行访问。类似于共享资源的访问保护。但是原子操作更加接近底层,即效率更高。

在以往C++中没有原子操作的规定,更多使用的都是汇编语言或者借助第三方库,如Intel的pthread来实现。但在C++11中的特性引入原子操作的相关概念,并通过新的头文件提供了多种原子操作数据类型。如atomic_bool,atomic_int等。如果需要多个线程对这些类型的共享资源进行操作,编译器将保证这些操作都是具有原子性的。通俗地说,就是确保在任意时刻只有一个线程对这个资源进行访问,编译器将保证多个线程访问这个资源的正确性,从而避免的使用,提高效率。

示例


#include <iOStream>
#include <thread>//C++11线程库且跨平台
#include <windows.h>//Sleep函数需要使用的库文件
using std::cout;
using std::endl;
using std::cin;
int g_total = 0;
void click()
{
	for (int i = 0; i < 1000000; i++)
	{
		g_total++;
	}
}

int main()
{
	for (int i = 0; i < 4; i++)
	{
		std::thread t(click);
		t.detach();
	}
	Sleep(1000);
	cout << "result:" << g_total << endl;
	return 0;
}

我们很正常的认为这样做是可以提高CPU的利用效率的,但是实际上执行结果并不正确。

效果图

紧接着,我们肯定想到使用互斥锁对共享资源进行保护。


#include <iostream>
#include <thread>//C++11线程库是跨平台的
#include <mutex>//C++11互斥锁
#include <windows.h>//Sleep函数需要使用的库文件
using std::cout;
using std::endl;
using std::cin;

int g_total = 0;
std::mutex g_mutex;
void click()
{
	for (int i = 0; i < 1000000; i++)
	{
		g_mutex.lock();//访问之前锁定互斥对象
		g_total++;
		g_mutex.unlock();//访问之后释放互斥对象
	}
}

int main()
{
	for (int i = 0; i < 4; i++)
	{
		std::thread t(click);
		t.detach();
	}
	Sleep(1000);
	cout << "result:" << g_total << endl;
	return 0;
}

初始对象的使用,保证同一时刻只有唯一一个线程对这个共享对象进行访问。

效果图

在C++11之前,互斥锁的概念已经足够了,但是在C++11提出之后,进一步利用CPU性能。在C++11中实现了原子操作的数据类型(如atomic_bool,atomic_int等)。使用原子操作的数据类型线程对其进行访问的时候无需借助mutex等锁机制,也能实现对共享资源的正确访问。


#include <iostream>
#include <thread>//C++11线程库是跨平台的
#include <atomic>//C++11原子操作库
#include <windows.h>//Sleep函数需要使用的库文件
using std::cout;
using std::endl;
using std::cin;
std::atomic_int g_total = 0;//使用原子操作的数据类型
void click()
{
	for (int i = 0; i < 1000000; i++)
	{
		//mutex.lock();
		g_total++;
		//mutex.unlock();
	}
}

int main()
{
	for (int i = 0; i < 4; i++)
	{
		std::thread t(click);
		t.detach();
	}
	Sleep(1000);
	cout << "result:" << g_total << endl;
	return 0;
}

效果图

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: C++11原子操作详解

本文链接: https://www.lsjlt.com/news/157766.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++11原子操作详解
    目录C++11原子操作原子操作的概念示例总结C++11原子操作 原子操作的概念 所谓原子操作,其意义就是“原子是最小的,不可分割的最小个体”。**表示当多个线程访问同一个全局资源的时...
    99+
    2022-11-12
  • JavaCAS原子操作详解
    目录一.什么是CAS二.流程三.应用四.源码解析五.缺点六.ABA 问题及解决方案一.什么是CAS CAS(Compare And Swap,比较并交换),通常指的是这样一种原子操作...
    99+
    2023-02-02
    Java CAS Java CAS机制 Java原子操作
  • C#原子操作实例分析
    这篇文章主要讲解了“C#原子操作实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#原子操作实例分析”吧!知识点竞争条件当两个或两个以上的线程访问共享数据,并且尝试同时改变它时,就发生...
    99+
    2023-06-29
  • Java CAS与Atomic原子操作核心原理详解
    目录什么是原子操作CAS相关原子操作类的使用AtomicIntegerAtomicIntegerArray更新引用类型原子更新字段类LongAdder什么是原子操作 Mysql事务中...
    99+
    2023-05-16
    Java CAS与Atomic原子操作 Java CAS原子操作 Java Atomic原子操作
  • Go语言并发之原子操作详解
    目录修改赋值与读取比较并交换小结代码中的加锁操作因为涉及内核态的上下文切换会比较耗时、代价比较高。针对基本数据类型我们还可以使用原子操作来保证并发安全,因为原子操作是Go语言提供的方...
    99+
    2022-12-29
    Go语言 并发 原子操作 Go语言 原子操作 Go语言 并发
  • 详解Golang五种原子性操作的用法
    目录Go 语言提供了哪些原子操作互斥锁跟原子操作的区别比较并交换atomic.Value保证任意值的读写安全总结本文我们详细聊一下Go语言的原子操作的用法,啥是原子操作呢?顾名思义,...
    99+
    2022-11-12
  • GO的锁和原子操作的示例详解
    目录GO的锁和原子操作分享锁是什么锁是用来做什么的互斥锁互斥锁 - 解决问题读写锁我们先来写一个读写锁的DEMO自旋锁和互斥锁的区别如何选择锁啥是原子操作总结GO的锁和原子操作分享 ...
    99+
    2023-02-24
    GO锁 原子操作 GO锁 GO 原子操作
  • C#多线程系列之原子操作
    目录知识点竞争条件线程同步CPU时间片和上下文切换阻塞内核模式和用户模式Interlocked类1,出现问题2,Interlocked.Increment()3,Interlocke...
    99+
    2022-11-13
  • Flutter如何保证数据操作原子性详解
    目录前言Flutter单例模式问题示例解决办法Flutter任务队列问题示例解决办法总结前言 Flutter 是单线程架构,按道理理说,Flutter 不会出现 Java 的多线程相...
    99+
    2022-11-13
  • JDK8中新增的原子性操作类LongAdder详解
    前言本文主要给大家介绍了关于JDK8新增的原子性操作类LongAdder的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:LongAdder简单介绍LongAdder类似于AtomicLong是原子性递增或者递减类,...
    99+
    2023-05-31
    jdk8 原子性 操作类longadder
  • C++11 constexpr使用详解
    目录1.constexpr初探2.constexpr修饰函数的限制3.使用编译时对象4.constexprvsconst的区别C++11为了提高代码执行效率做了一些改善。这种改善之一...
    99+
    2022-11-12
  • C++11 中的override详解
    目录1 公有继承1.1 纯虚函数 (pure virtual)1.2 普通虚函数1.2.1 方法一1.2.2 方法二1.3 非虚函数2 重写 (override)小结:参考资料1 公...
    99+
    2022-11-13
  • Java多线程 原子操作类详细
    目录1、What and Why2、原子更新基本类型类3、实现原理4、原子更新数组5、原子更新引用类型6、原子更新字段类1、What and Why 原子的本意是不能被分割的粒子,而...
    99+
    2022-11-12
  • C++11中的chrono库详解
    目录前言1、记录时长的duration2、表示时间点的time_point3、获取系统时钟的clocks前言 C++11提供了日期时间相关的库chrono,通过chrono库可以很方...
    99+
    2023-03-19
    C++11中的chrono库 C++11 chrono库
  • 详解c++ atomic原子编程中的Memory Order
    目录概述Relaxed orderingRelease-Acquire ordering使用Release-Acquire ordering实现双重检查锁模式(DLCP)使用Rele...
    99+
    2022-11-12
  • 详解C++11中绑定器bind的原理与使用
    目录bind1st和bind2nd什么时候会用到函数对象绑定器bind1st和bind2nd的底层实现原理bind1st和bind2nd什么时候会用到 bind用于绑定可调用 (Ca...
    99+
    2022-12-09
    C++11绑定器bind C++11绑定器 C++11 bind
  • 什么是原子操作?深入浅析go中的原子操作
    在我们前面的一些介绍 sync 包相关的文章中,我们应该也发现了,其中有不少地方使用了原子操作。 比如 sync.WaitGroup、sync.Map 再到 sync.Pool,这些结构体的实现中都有原子操作的身影。 原子操作在并发编程中是...
    99+
    2023-05-14
    原子操作 后端 Go
  • C++11的shared_ptr工作原理是什么
    这篇文章主要介绍“C++11的shared_ptr工作原理是什么”,在日常操作中,相信很多人在C++11的shared_ptr工作原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++11的share...
    99+
    2023-06-19
  • 详解C++11中的线程库
    目录一、线程库的介绍1.1. 使用时的注意点1.2. 线程函数参数1.3. join与detach二、原子性操作库2.1. atomic2.2. 锁三、使用lambda表达式创建多个...
    99+
    2022-11-13
  • Java并发编程之原子操作类详情
    JUC包提供了一系列的原子性操作类,这些类都是使用非阻塞算法CAS实现的,相比使用锁实现原子性操作者在性能上有很大提升。JUC包中含有AtomicInteger、AtomicLong...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作