在现代C++中,并发支持库旨在解决多线程操作中的问题。此库包含对线程的内置支持(标准::线程
),原子操作(标准::原子
),互斥(标准::互斥
),条件变量(标准::condition_variable
)以及的许多其他功能现代C++编译器.在这篇文章中,我们解释了什么是标准::原子
以及我们如何在现代C++中有效地使用原子类型。
什么是现代C++中的原子(std::atomic)?
在现代C++中,原子库为原子操作提供了有用的功能,允许C++中的无锁并发操作。对于涉及同一对象的任何其他原子操作,每个原子操作都是不可分割的。
C++11添加原子类型和操作符合标准。原子类型和操作提供了一种在不使用锁的情况下编写多线程应用程序的方法。在现代C++中标准::原子<>
模板类在中定义<原子>
header,它可以用于包装其他类型,以便对该类型执行原子操作。当一个线程写入一个原子对象时,另一个线程可以从中读取标准::原子
模板定义了原子类型。
原子类型确保任何读或写操作作为多线程操作的一部分进行同步(即在标准::线程
). 它们在私有类型(即。整数
,浮动
,双重的
(等)或任何普通可复制类型的类型,这意味着它至少有一个合格的复制构造函数、移动构造函数、复制赋值运算符或移动赋值运算符,并且具有未删除的普通析构函数。
以下是原子声明的简单语法:
以下是中定义的语法<原子>
自C++11以来的标头:
|
模板< 班 T型 > 结构 原子的< T型* >; |
以下是在<内存>
自C++20以来的标头:
|
模板< 班 T型 > 结构 原子的< 标准::共享ptr<T型> >; |
|
模板< 班 T型 > 结构 原子的< 标准::弱ptr<T型> >; |
标准::原子
具有许多可用于原子操作的功能,即。load、store、operator=、wait、exchange、is_lock_free、,这些将在另一篇文章中解释。
有没有一个简单的例子说明如何在现代C++中使用std::atomic?
这里有一个简单的标准::原子
例子:
|
标准::原子的<未签名的 整数> 柜台(0); //原子类型 空隙 我的朋友() //用于多线程操作的函数 { 柜台++; //原子操作 } |
在现代C++中,有没有一个完整的例子来说明如何在lambda中使用std::atomic?
这是一个完整的标准::原子
使用的示例标准::线程
、和标准::矢量
:
1 2 三 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
#包括<iostream> #包含<矢量> #包含<线程> #包含<原子> 标准::原子的<未签名的 整数> 柜台 = 0; 整数 主要的() { 标准::矢量< 标准::线> 我的; //线程向量 汽车λ = [&] { ++柜台; }; 对于 (未签名的 整数 我 = 0; 我 < 16; 我++) { 我的.后推(_B)( 标准::线( λ) ); //将函数添加到线程向量 } 对于 (汽车& t吨 : 神话) { t吨.参加(); //等待每个线程执行完成并返回 } 标准::cout公司 << 柜台 << 标准::端部; 系统(“暂停”); 返回 0; } |
注意,这些原子类型上的每个操作都称为原子操作。有关此功能的更多信息,请参阅原子操作提案文件.
C++生成器是在Windows、MacOS、iOS和Android操作系统上构建简单或专业应用程序的最简单、最快的C和C++IDE。对于初学者来说,它也很容易学习,它有广泛的示例、教程、帮助文件和对代码的LSP支持。RAD Studio的C++Builder版本附带用于高性能本机Windows应用程序的屡获殊荣的VCL框架,以及用于跨平台UI的强大FireMonkey(FMX)框架。
有一个免费的C++Builder社区版,面向学生、初学者和初创公司;可以从下载在这里。对于专业开发人员,有professional、Architect或Enterprise版本。