• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2020-05-07 06:35 Aet 隐藏边栏 |   抢沙发  11 
文章评分 8 次,平均分 5.0

什么是并发

概念

在最简单,最基本的层面,并发是指两个或更多的独立活动同时发生。

计算机的并发

指的是在单个系统里,同时执行多个独立的活动,而不是顺序地或是一个接一个地。

两种并发

任务切换

以前,大多数计算机都只有一个处理器,具有单个处理单元或核心,至今有很多机器仍是这样。

对于这样的计算机

它们在某一时刻只可以真正的执行一个任务,但是它可以每秒切换任务许多次。

通过这种机制,做一点这个任务再做一点别的任务,看起来像是任务在并行发生。这个就是任务切换。

这样的系统,却是仍然被称为并发,因为任务切换的太快,以至于无法分辨任务在何时会被暂挂而切换到另一个任务。

硬件并发

计算机如果拥有多个处理器或者一个多核处理器,或者两者都兼备。

这样的计算机能够正在的并行运行超过一个任务。这个就是硬件并发。

并行&&并发

  • 并行
    • 同一时刻,能够处理多个活动或任务
  • 并发
    • 同一时段,能够处理多个活动或任务

并发途径

多进程并发

将应用程序分为多个、独立的、单线程的进程,它们运行在同一时刻。

这些独立的进程可以通过所有常规的进程间通信渠道互相传递消息。

多线程并发

在单个进程中运行多个线程。

线程是轻量级的进程:每个线程相互独立运行,且每个线程可以运行不同的序列指令。

但进程间的所有线程都共享相同的地址空间,并且能从所有线程中访问到大部分数据(比如全局变量仍然是全局的,此外,还有指针、对象的引用或数据都可以在线程之间传递。)

为什么使用并发

关注点分离

通过将相关的代码放在一起并将无关的代码分开,这种方法可以使我们的程序更加容易理解和测试,从而减少出错的可能性。

我们可以并发来分隔不同的功能区域,即使在这些不同功能区域的操作需要在同一时刻发生的情况下。

性能

  • 任务并行
    • 将一个单个任务分成几部分且各自并行运行,从而降低总运行时间。
  • 数据并行
    • 一个线程执行算法的一部分而另一个线程执行算法的另一部分
    • 每个线程在不同的数据部分上执行相同的操作。

什么时候不使用并发

基本上,不使用并发的唯一原因就是在收益比不上成本的时候。

线程是有限的资源。如果让太多的线程同时运行,会消耗操作系统资源,并且使得操作系统整体上运行得更缓慢。

运行太多得线程会耗尽进程得可用内存或地址空间,因为每个线程需要一个独立得堆栈空间。对于一个空间地址空间限制为4GB的扁平架构的32位进程来说,这尤其是个问题。如果每个线程都有1MB的空间(对于很多系统来说是典型的),那么4096个线程将会用尽所有地址空间,不再为代码、静态数据或堆数据留有空间。虽然64位的系统不存在这种直接的地址空间限制,它们仍然只具备有限的资源。

新标准并发支持

  • 全新的线程感知内存模型
  • 管理线程
  • 保护共享数据
  • 线程间同步操作
  • 低级原子操作

实例

  • #include <thread>
    • 用于管理线程的函数和类在<thread>中声明
  • 每个线程都必须具有一个初始函数,新线程的执行在这里开始
    • 初始线程从main()开始
  • 新线程启动之后,初始线程如果不等待新线程结束,它将继续执行
  • 让初始线程等待与std::thread对象相关联的线程

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2022-08-02
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享