文章目录
前言
本文主要内容
- 何谓并发和多线程
- 应用程序为什么要使用并发和多线程
- C++的并发史
- 一个简单的C++多线程程序
一、何谓并发
最简单和最基本的并发,是指两个或更多独立的活动同时发生。
1.1 计算机系统中的并发
计算机领域的并发指的是在单个系统里同时执行多个独立的任务,而非顺序的进行一些活动。
并发的两种方式:双核机器的真正并行,单核机器的任务切换
四个任务在两个核心之间的切换
1.2 并发的途径
- 每个进程只要一个线程
- 每个进程有多个线程
- 多进程并发
一对并发运行的进程之间的通信
- 多线程并发
同一进程中的一对并发运行的线程之间的通信
多个单线程/进程间的通信(包含启动)要比单一进程中的多线程间的通信(包括启动)的开销大,若不考虑共享内存可能会带来的问题,多线程将会成为主流语言(包括C++)更青睐的并发途径。
1.3 并发与并行
其区别主要在于关注点和意图方面(差距甚微),都是用来对硬件在同时执行多个任务的方式进行描述的术语,不过并行更加注重性能
二、为什么使用并发
主要原因有两个:
- 关注点分离(SOC)
- 性能
2.1 为了分离关注点
通过将相关的代码与无关的代码分离,可以使程序更容易理解和测试,从而减少出错的可能性。
2.2 为了性能
两种方式利用并发提高性能:
- 第一,将一个单个任务分成几部分,且各自并行运行,从而降低总运行时间。这就是任务并行(task parallelism)。
- 使用可并行的方式,来解决更大的问题,例如:并行处理图片就能提高视频的分辨率。
2.3 什么时候不使用并发
基本上,不使用并发的唯一原因就是收益比不上成本。
三、C++中的并发和多线程
3.1 C++多线程历史
在C++98标准下,在缺少编译器相关扩展的情况下,没办法编写多线程应用程序。
3.2 新标准支持并发
C++11标准的发布而改变,新标准中不仅有了一个全新的线程感知内存模型,C++标准库也扩展了:包含了用于
- 管理线程、
- 保护共享数据、
- 线程间同步操作,
- 以及低层原子操作的各种类。
3.4 C++线程库的效率
- C++标准委员会在设计标准库时,特别是标准线程库的时候,该类库在大部分主流平台上都能实现高效。
- 使用了新标准的代码会具有更好的可移植性,而且更容易维护。
- C++标准库也提供了更高级别的抽象和工具,使得编写多线程代码更加简单,并且不易出错。
四、开始入门
4.1 你好,并发世界
#include<iostream>
int main()
{
std::cout << "Hello World" << std::endl;
}
#include<iostream>
#include<thread> //1 增加了 #include <thread>
static void hello() //2 打印信息的代码被移动到了一个独立的函数中
{
std::cout << "Hello Concurrent World" << std::endl;
}
int main()
{
std::thread t(hello); //3
t.join(); //4
system("pause");
return 0;
}