现代C ++中的多线程

前言

随着新的C ++ 11标准发布,C ++首次面临多核架构的挑战。
2011年发布的标准定义了C ++程序在存在多个线程时的行为方式。
C ++ 11多线程功能由两个组件组成:一方面是内存模型的定义,另一方面是标准化的线程接口。
下面是C++进化图:
这里写图片描述


一个定义明确的内存模型

一个定义明确的内存模型是基础,以此确保在C ++中多线程编程是有意义的。因此,内存模型上必须给出以下问题的答案:

1、什么是原子操作?

原子操作是遵循数据库理论中著名的ACID成语的前三个字母的操作。
原子操作是原子atomic(A),从一个一致的consistent(C)状态到下一个,并且是执行时是孤立的isolation(I)。
这意味着没有其他线程可以观察到原子操作的中间状态。
用增量atomVar ++ 表示原子操作的一致性和隔离比较好。如果atomVar是原子变量,则atomVar只能包含旧值或新值。变量atomVar的一致性是指,它只从一个状态变为另一个状态和隔离,另一个线程无法观察到任何中间值。


2、确保什么样的操作顺序?

得保证将程序转换为汇编程序指令的编译器和执行汇编程序指令的处理器都可以重新安排操作。
一般是性能方面的要求。
另外,各种存储层(高速缓存)也有操作结果提供较慢的可能性。


3、什么时候可以看到操作的内存效果?

由于一个线程很可能比另一个线程更晚看到变量上的操作,所以线程必须遵守某些规则。


标准化的线程接口

C ++ 11中的标准化线程接口由以下组件组成:

1、线程

线程是多线程编程的基本构建块。他们自主地完成工作,通过参数进行参数化,并通过共享变量与其他线程进行交互。


2、任务

任务是一个相对现代的概念。任务由两个组件组成,它们由通信信道连接。一个组件作为通道的端点产生结果,而另一个端点则使用它。生产者被称为Promise,消费者被称为Future。


3、线程本地数据

线程本地数据当然是数据 – 可以很容易从名称中猜出,这些数据属于一个线程。


4、条件变量

条件变量使其能够实现生产者/消费者工作模式。消费者等待生产者的通知,以便可以继续它的工作。


C ++ 17和C ++ 20会带来什么?

下一个C ++标准计划在2017年和2020年.C ++ 17和C ++ 20将围绕现有标准的多线程功能进行许多扩展。因为现有的功能非常基础。这些变化可能包括以下三个有趣的功能:

1、Latches and barriers闩锁和障碍

闩锁和障碍类似于信号量。


2、Transactional memory 事务性内存

事务性内存简单地说是应用ACID的想法(再次只有前三个字母)来编码。
这意味着,代码被注释为事务性内存,并且在不与其他线程同步的情况下,代码被优化地移植。
在事务结束时,如果初始条件仍然有效,则只公布结果。如果无效,则执行的结果被拒绝,并且再次执行事务。
虽然临界区总是被互斥锁锁定,然而事务却没有被锁定,但执行结果可能会被丢弃。关键区域是代码的一部分,一次允许最多允许一个线程进入。
临界区是代码的一部分,最多允许一段时间内只有一个线程可以进入。


3、自动并行化或矢量化标准模板库(STL)的算法

并行化算法是指在多个线程上对某容器进行操作。
矢量化算法是在一个步骤中对容器的多个元素进行预操作。


原文:

http://www.modernescpp.com/index.php/multithreading-in-modern-c

猜你喜欢

转载自blog.csdn.net/y396397735/article/details/80978873
今日推荐