C++多线程 第一章 你好,C++并发世界
第一章 你好,C++并发世界
C++并发
并发(concurrency): 主要包括 任务切换 与 硬件并发 两类.
并发(concurrency) 实际上与 多线程(multithreading) 存在差异.
并发的种类
任务切换(task switching): 计算机在某一时刻只可以真正执行一个任务,但它可以每秒切换任务许多次.通过做一点这个任务然后再做一点别的任务,看起来像是任务在并行发生.这就是:任务切换(task switching).
硬件并发(hardware concurrency): 无论拥有多个处理器或一个多核处理器,这些计算机能够真正并行运行超过一个任务.为了实行交替进行,系统在从一个任务切换到另一个时都需要进行 上下文切换(context switch).决定其效率最重要的因素是 硬件线程(hardware threads) 的数量.
并发的方法
多进程并发: 将应用程序分为多个独立的单线程进程,它们通过通信互相传递信息.
多线程并发: 在单个进程中运行多个线程.
并发的应用情景
任务并行(task parallelism): 将一个单一任务分成几部分并且各自并行执行,从而降低总运行时间.
数据并行(data parallelism): 一个线程执行算法的一部分,而另一个线程执行算法的另一部分;或者每个线程在不同的数据部分上执行相同的操作.
C++并发的特征
资源获得即初始化(RAII): C++标准保证任何情况下,已构造的对象最终会销毁,即它的析构函数最终会被调用.通过这种方式可以保证线程在退出相关作用域时互斥元被解锁.
抽象惩罚(abstraction penalty): 与直接使用底层的低级工具相比,使用高级工具所带来的实现成本一般会更多.
C++并发程序
我们前面已经学习过OpenMP解决并发问题的方式了,现在让我们快速进入如何使用C++解决并发问题.
下面是一个常见的Hello World程序:
#include <iostream>
int main()
{
std::cout << "Hello World!\n";
return 0;
}
让我们来将其并行化:
#include <iostream>
#include <thread>
void hello()
{
std::cout << "Hello Concurrent World\n";
}
int main()
{
std::thread t(hello);
t.join();
return 0;
}
这是我们第一个通过C++执行并行化的程序,这很值得我们庆祝,不是吗?
晚上去吃门口的那个什么铜鼎锅吧,记得吃麻酱碟(