转载请注明作者和出处:https://blog.csdn.net/qq_28810395
运行平台: Windows 10
LeetCode官网:Fhttps://leetcode-cn.co
一、并发,同步,异步,互斥,阻塞,非阻塞的理解
1.并发,同步,异步,互斥,阻塞,非阻塞的概念⭐⭐⭐⭐⭐
-
并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。其中两种并发关系分别是同步和互斥。
- 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
- 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。
- 总结:同步是一种更为复杂的互斥,而互斥是一种特殊的同步。
-
同步与异步
- 同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。
- 异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。
注意
:- 线程是实现异步的一个方式。可以在主线程创建一个新的线程来做某件事,此时主线程不需等待子线程做完而可以做其他事情。
- 异步和多线程并不是一个同等关系。异步是最终目的,多线程是我们实现异步的一种手段。
-
阻塞与非阻塞:
阻塞与非阻塞是当进程在访问数据时,根据IO操作的就绪状态不同而采取的不同处理方式,比如主程序调用一个函数要读取一个文件的内容,阻塞方式方式下主程序会等到函数读取完再继续往下执行,而非阻塞方式,读取函数会立刻返回一个状态值给主程序,主程序不等待文件读取完就继续往下执行。一般来说可以分为同步阻塞、同步非阻塞、异步阻塞与异步非阻塞。
以发送方发出请求要接收方读取某文件内容为例:
同步阻塞:发送方发出请求后一直等待(同步),接收方开始读取文件,如果不能马上得到读取结果就一直灯,直到获取读取结果再响应发送,等待期间不可以做其他的操作(阻塞);
同步非阻塞:发送方放出请求后一直等待(同步),接收方开始去读文件,如果不能马上得到读取结果,就立即返回,接收方继续去做其他事情。此时并未响应发送发,发送发一直在等待。直到IO操作(读取文件)完成后,接收方获得读取结果响应发送方,接收方才可以进入下一次请求过程。(实际不易应用)
异步阻塞:发送方发出请求后,不等待响应,继续其他工作(异步),接收方文件如果不能马上得到结果,就一直等到返回结果后,才响应发送方,期间不能进行其他操作(阻塞)。(实际不应用)
异步非阻塞:发送方发出请求后,不等待响应,继续其他工作(异步),接收方读取文件如果不能马上得到结果,也不等待,而是马上返回做其他事情。当IO操作(读取文件)完成以后,将完成状态和结果通知接收方,接收方在响应发送方。(效率最高)
总结:- 同步与异步是对应的,他们是线程之间的关系,两个线程之间要么是同步的,要么是异步的。
- 阻塞与非阻塞是对同一个线程来说,在某个时刻,线程要么处于阻塞,要么处于非阻塞。
- 阻塞是使用同步机制的结果,非阻塞是使用异步机制的结果。
2.什么是线程同步与互斥⭐⭐⭐⭐
- 线程同步:每个线程之间按预定的先后次序进行运行、协同、协助、互相配合。可以理解成“你说完,我在做”。有了线程同步,每个线程才不是自己做自己的事情,而是协同完成某件大事。
- 线程互斥:当若干个线程访问同一块资源时候,规定同一时间只有一个线程可以得到访问权,其他线程需要等占用自愿者释放该资源才能申请访问。线程互斥可以看成一种特殊的线程同步 。
3.线程同步与阻塞的关系?同步一定阻塞吗?阻塞一定同步吗?⭐⭐⭐
同步是个过程,阻塞是进程的一个状态。当多个线程访问同一个资源时,规定同一时间只有一个线程可以进行访问,所以后访问的线程将阻塞,等待前访问的线程访问完成。
注意
:线程同步不一定发生阻塞!线程同步的时候,需要协调推进速度,只有当访问同一资源出现互相等待和互相唤醒会发生阻塞。