前言
在多线程程序中经常使用并发、并行,同步、异步这两组概念,那么下面说一下我所理解的这两组概念的联系与区别。
并发
并发指两个或两个以上的事件在同一时间段内发生(注意:
这里指的时间段是在微观上看,所以它很短,我们感觉不出来事件发生的时间差)。
并发意味着应用程序同时在多个任务上取得进展。那么,如果计算机只有一个CPU,应用程序可能不会同时完成多个任务,但在应用程序的某个时间内正在处理多个任务。它不能完全完成一个任务,然后再开始下一个任务。
并行
并行指两个或两个以上的事件在同一时刻发生。
并行意味着应用程序拆分成更小的子任务,这些任务可以并行处理,例如在多CPU在同一时间。
总结
如上,并发性与应用程序处理多个任务的方式有关。应用程序可以在某个时间(顺序地)处理一个任务,或者同时处理多个任务。
另一方面,并行性与应用程序如何处理每个单独的任务有关。一个应用程序可以处理连续的任务从开始到结束,或将任务分解成子任务可以并行完成。
并发可认为是一种逻辑结构的设计模式。你可以用并发的设计方式去设计模型,然后运行在一个单核系统上,通过系统动态地逻辑切换制造出并行的假象。此时,你的程序不是并行,但是是并发的。你可以将这种模型不加修改地运行在多核系统上,此时你的程序可以认为是并行。而并行则更关注的是程序的执行。
串行
串行指多个任务时,各个任务按顺序执行,完成一个之后才能进行下一个。
同步
同步
串行是同步线程实现的方式。一个任务执行完成后才能执行下一个任务,单线程只能执行一个任务。
异步
异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。线程就是实现异步的一个方式。异步是让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其它的事情。
并发和并行其实是异步线程实现的两种形式。并行其实是真正的异步,多核CUP可以同时开启多条线程供多个任务同时执行,互补干扰。但是并发就不一样了,是一个伪异步。在单核CUP中只能有一条线程,但是又想执行多个任务。这个时候,只能在一条线程上不停的切换任务。
小结
同步和异步是在多任务的情况下,这是前提。其次,同步和异步是指逻辑调用方式。同步的前一个逻辑调用的输出作为第二个逻辑调用的输入,后一个逻辑调用必须等待前一个调用执行完才能开始调起执行。正好与同步相反,后一个逻辑调用无需等待前一个逻辑调用执行完毕。也就是说前一个逻辑调用发起后就直接返回了,并没有输出,而是在调用执行完成后通过状态、通知来通知调用者,或通过回调函数处理这个调用。
本文摘录了一下网上相关内容以及自己的一些理解,有问题请留言,谢谢啦!