什么是并发
概念
在最简单,最基本的层面,并发是指两个或更多的独立活动同时发生。
计算机的并发
指的是在单个系统里,同时执行多个独立的活动,而不是顺序地或是一个接一个地。
两种并发
任务切换
以前,大多数计算机都只有一个处理器,具有单个处理单元或核心,至今有很多机器仍是这样。
对于这样的计算机
它们在某一时刻只可以真正的执行一个任务,但是它可以每秒切换任务许多次。
通过这种机制,做一点这个任务再做一点别的任务,看起来像是任务在并行发生。这个就是任务切换。
这样的系统,却是仍然被称为并发,因为任务切换的太快,以至于无法分辨任务在何时会被暂挂而切换到另一个任务。
硬件并发
计算机如果拥有多个处理器或者一个多核处理器,或者两者都兼备。
这样的计算机能够正在的并行运行超过一个任务。这个就是硬件并发。
并行&&并发
- 并行
- 同一时刻,能够处理多个活动或任务
- 并发
- 同一时段,能够处理多个活动或任务
并发途径
多进程并发
将应用程序分为多个、独立的、单线程的进程,它们运行在同一时刻。
这些独立的进程可以通过所有常规的进程间通信渠道互相传递消息。
多线程并发
在单个进程中运行多个线程。
线程是轻量级的进程:每个线程相互独立运行,且每个线程可以运行不同的序列指令。
但进程间的所有线程都共享相同的地址空间,并且能从所有线程中访问到大部分数据(比如全局变量仍然是全局的,此外,还有指针、对象的引用或数据都可以在线程之间传递。)
为什么使用并发
关注点分离
通过将相关的代码放在一起并将无关的代码分开,这种方法可以使我们的程序更加容易理解和测试,从而减少出错的可能性。
我们可以并发来分隔不同的功能区域,即使在这些不同功能区域的操作需要在同一时刻发生的情况下。
性能
- 任务并行
- 将一个单个任务分成几部分且各自并行运行,从而降低总运行时间。
- 数据并行
- 一个线程执行算法的一部分而另一个线程执行算法的另一部分
- 每个线程在不同的数据部分上执行相同的操作。
什么时候不使用并发
基本上,不使用并发的唯一原因就是在收益比不上成本的时候。
线程是有限的资源。如果让太多的线程同时运行,会消耗操作系统资源,并且使得操作系统整体上运行得更缓慢。
运行太多得线程会耗尽进程得可用内存或地址空间,因为每个线程需要一个独立得堆栈空间。对于一个空间地址空间限制为
4GB
的扁平架构的32位进程来说,这尤其是个问题。如果每个线程都有1MB
的空间(对于很多系统来说是典型的),那么4096个线程将会用尽所有地址空间,不再为代码、静态数据或堆数据留有空间。虽然64位的系统不存在这种直接的地址空间限制,它们仍然只具备有限的资源。
新标准并发支持
- 全新的线程感知内存模型
- 管理线程
- 保护共享数据
- 线程间同步操作
- 低级原子操作
实例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <iostream> #include <thread>//1 void hello()//2 { std::cout << "Hello cur world..." << endl; } int main() { std::thread t(hello);//3 t.join();//4 } |
#include <thread>
- 用于管理线程的函数和类在
<thread>
中声明
- 用于管理线程的函数和类在
- 每个线程都必须具有一个初始函数,新线程的执行在这里开始
- 初始线程从
main()
开始
- 初始线程从
- 新线程启动之后,初始线程如果不等待新线程结束,它将继续执行
- 让初始线程等待与
std::thread
对象相关联的线程
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Effective C++_第二篇07/01
- ♥ Photoshop CEP扩展和插件开发04/27
- ♥ 包管理器:设计与实现09/18
- ♥ 打包_7z生成自解压打包exe07/11
- ♥ C++并发编程 _ 无锁数据结构09/18
- ♥ C++20_第二篇03/21