Concurrecy vs. Parallelism:C++ Concurrency In Action 2nd 的作者与众不同的观点

一、引言

最近在学习《C++ Concurrency In Action 2nd》这本书,作者在本书一开头使用了大量的篇幅举了一个例子:

想象有一个场景,在一家 IT 公司里,有两个程序员分为 A 和 B。会有这么两种工作的分配情况:

  1. A 和 B 分别拥有一个办公室,有自己的参考手册。他们自己单独工作,交流通过电话、邮件,或者直接步行到另一个程序员的办公室里
  2. A 和 B 同时在一个办公室,只有一份参考手册。他们在一起工作,可以非常方便的交流,但是参考手册可能就会出现有时候找不到的情况

这个例子非常的简单,但是却隐喻了实现并发的两种方式。其中办公室隐喻进程,参考手册隐喻进程内的资源,A 和 B 分别意味着线程。实现并发有两种方式,一种就是两个进程,进程间通信(socket、pipe、signal 等等方式);另一种就是多线程。

作者花了这么长的时间阐述这个例子抛砖引玉,一方面为了让读者了解什么是并发(Concurrency),让读者搞清楚多线程(Multithreading)与并发的关系(多线程并不是实现并发的唯一方法);另一方面,就是为了引出下一个话题:

并发(Concurrency)与并行(Parallelism)的区别是什么?

关于这个问题,我也曾经在网上搜过。网上的博客往往能够就这个问题讨论出非常大的篇幅,可以说各自有各自的说法。

但是至少,学习 C++ 的人有福气了。《C++ Concurrency In Action 2nd》的作者在书中给出了他自己的见解。这里,我也非常开心的能够将作者的思想分享到博客中,就算你不太认同作者的观点,至少在谈论这个问题的时候,你还能想到有人确实是这么认为的。

二、C++ Concurrency In Action 2nd 作者的观点

这里,我直接先贴上作者的原文:

Concurrency and parallelism have largely overlapping meanings with respect to multithreaded code. Indeed,to many they mean the same thing. The difference is primarily a matter of nuance, focus, and intent. Both terms are about running multiple tasks simultaneously, using the available hardware, but parallelism is much more performance-oriented.

这里简单翻译一下:

并发和并行在多线程编程的领域中有太多地方有着重叠的含义。实际上,在很多地方他们有着同样的含义。两者的区别主要是细微的区别,比如说关注点上、目的上。这两个术语都意为在可用硬件上同时地运行多个任务,不同的地方在于并行更加的关注性能。

作者这里提到,并发和并行并无太大的区别,两者实际上很多地方含义重叠。两者的区别非常的细微,并行更加注重性能上的含义。

接下来,作者举了一个非常形象的例子:

People talk about parallelism when their primary concern is taking advantage of the available hardware to increase the performance of bulk data processing, whereas people talk about concurrency where their primary concern is separation of concerns, or responsiveness.

简单翻译一下:

人们在提到并行的时候,关心的是如何在可用硬件上去提高大量数据的处理性能,而谈到并发的时候,则更关心分离的含义,或者说程序的响应能力。

简单来说,作者认为并发更加注重分离的含义,而并行更加注重性能。

以上,就是《C++ Concurrency In Action 2nd》的作者对于并发(Concurrency)和并行(Parallelism)二者区别的观点。

三、网上普遍的观点

有趣的事情是,如果你尝试在网上搜索 “并发与并行的区别”,你会发现有一种主流的认知,那就是(引用自知乎最高赞答案):

你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。并发的关键是你有处理多个任务的能力,不一定要同时。

并行的关键是你有同时处理多个任务的能力。所以我认为它们最关键的点就是:是否是『同时』。
作者:「已注销」
链接:https://www.zhihu.com/question/33515481/answer/58849148
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这种观点的关键点在于,并发有一个队列的含义,即使当前不能处理完事务,也要在之后能够完成,也就是重在能完成;并行则一定要支持同时完成,就是在你接到这个任务的时候就要能够着手去做他。

也就是这个知乎答主所说的,关键点在于是否是 “同时”。

那么这一个观点是否意味着 《C++ Concurrency In Action 2nd》作者的认为是错误的了呢?

我觉得也不然,就像作者所说的,并发更加注重分离的行为,并行更加注重性能。其实与网上这种普遍的认知也是暗合的。

三、总结

并发与并行的区别这个问题,网上有太多的声音,各有各的想法。有些人觉得并发是逻辑上的设计模式,是能够处理多个任务的一种方式;认为并行则是同时在做多个事情。

而 《C++ Concurrency In Action 2nd》作者认为,并发与并行实际上已经有太多重叠的含义了,只有细微的差别而已,并发更加注重于分离的行为的本身,或者响应能力;并行则更加注重提高性能相关的方面。

至于哪种观点是对的,取决于你自己的判断。

毕竟我们也不是学院派的那群老学究,对于我们普通的程序员来说,集思广益,有自己的见解是最好的了:)

希望本篇博客能够对你有一些帮助~~~
To be Stronger:)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值