第一章:你好,C++并发世界
至C++11开始,C++标准支持多线程程序.
什么是并发
人可以一边唱歌一边跳舞,计算机呢?
单处理器计算机每秒可以切换任务许多次,做一点A任务再做一点B任务,然AB任务看起来是并行发生.这就是任务切换.任务切换可以被看做并发.
多处理器计算机或多核处理器能够真正的并行运行超过一个任务.称为硬件并发.
在单核计算机上,任务切换需要执行一次上下文切换,这需要时间.

并发的途径
多进程并发
将一个应用程序分为多个独立的单线程进程,这些进程之间通过进程间通信传递信息.由于操作系统在进程间提供了大量的保护,多进程并发通常设置复杂,速度较慢.
多线程并发
在单个进程中运行多个线程.多线程共享地址空间,不需要线程间的操作保护,因此相比于多进程,多线程开销很小.缺点是:程序员必须确保每个线程访问时看到的数据是一致的.
为什么使用并发
为了提升性能而使用并发.使用并发提升性能方式有二.
- 任务并行:一个线程执行算法的一部分,另一个线程执行算法的另一部分.
- 数据并行:每个线程在不同的数据部分上执行相同操作.
什么时候不使用并发
知道何时不适用并发与知道何时使用并发同等重要.
不使用并发的唯一原因是收益比不上成本.
- 编写并发代码有直接的脑力成本,增加代码的复杂性,可能导致更多的错误.
- 并发带来的性能增益可能不如预期,启动线程具有固有开销.线程是有限的资源,让太多线程同时运行可能使得整体运行的更慢.
C++新标准中的并发支持
C++11具有全新的线程感知内存模型.标准库中包含:线程管理,保护共享数据,线程间同步以及原子操作的各个类.
开始入门:你好,并发世界
先从简单的单线程打印HelloWorld程序开始.
int main() {
std::cout << "Hello World\n";
}
启动一个独立线程显示Hello World.
void hello() {
std::cout << "Hello Concurrent World!\n";
}
int main() {
std::thread t(hello);
t.join();
}
与单线程代码的区别:
- 需要
#include<thread>,它声明了用于管理线程的函数和类. - 打印函数移动到了一个独立函数中,因为每个线程必须具有一个初始函数用于新线程的执行.对于应用程序,初始线程是main(),其他线程由thread对象的构造函数指定.
新线程启动后,初始线程继续执行.初始线程可能在新线程之前结束,因此调用join(),让调用新线程的线程(main())等待与std::thread相关联的线程.
1630

被折叠的 条评论
为什么被折叠?



