就是要弄懂你之—— 同步 异步 阻塞 非阻塞

相信很多人都会弄混这些概念,甚至记了之后又容易忘记,其实就是没有深入了解。虽然其他的博客有举一些水壶啊,狗啊等例子,但是还是模糊不清,看看我这个能不能把你弄懂。 本文重在分清楚4者的概念,并没有深入的去讲解,因为其他博客已经说的很多了。

这里先给你一个概念同步异步是个操作方式,阻塞非阻塞是线程的一种状态。

同步 :一个功能调用时,没有得到结果之前,就不会返回,可以说是一种操作方式。
参考线程同步,我访问这个临界区时,你就不能访问。也可看做是单线程操作,在调用没有返回之前一直阻塞。
异步: 调用发出后,不能立即得到结果,是在完成后再返回通知调用者。
参考 服务器可以把客户端请求放在线程让它自己跑,然后主线程可以干其他事。

这里同步异步我们把它们分成2种情况,一种是线程方面的,一种是处理方面的。

线程同步就是多个线程访问同一资源,等待资源访问结束。就好像我们多线程写同一个文件需要用互斥锁一样。
线程异步就是在访问资源的同时访问其他资源,实现多线程机制。
同步处理就是你问我问题我自己花时间算好了在回答你。(即线程等待调用的函数把数据全部处理完成才返回)
异步处理就是你问我,我叫别人算好答案告诉我,(若我什么都不做光等待计算结果就是阻塞,我做其他事情就是非阻塞)。( 即新开一个线程把该函数给另一个线程处理,主线程可以一直(以阻塞非阻塞形式)获取处理完成的值)。
简单来说就是一根筋两根筋的事,也就是对一件事情的处理方式。
------------------------- ------------------------- -------------------------
阻塞: 调用结果返回前,线程挂起。
参考互斥锁,信号量的sem_wait。
非阻塞: 调用不会阻塞线程,而且立即返回。
参考 信号量的try_wait。
------------------------

同步与阻塞、非阻塞

同步是个处理方式,操作方式、手段,阻塞是线程的一种状态,两者并不相同也并不冲突。同步操作防止多线程访问临界区,后进入临界区的线程将被阻塞。
~~~~然而 线程同步一定产生阻塞吗?不,同步可以使用非阻塞模型,当临界区不可读,调用则返回,先去做别的事,又再访问临界区,一直重复。而 同步处理则是定会阻塞。
异步与阻塞、非阻塞
异步阻塞,就是别人问我问题,我叫了另一个人帮我算,而我就等着那个人帮我算好告诉我(相当于我开了一个线程计算,而主线程阻塞等待线程计算结果的返回,而不做任何事,这是不是蠢,还不如自己算,还节省开线程的资源)。
异步非阻塞就是别人问我问题,我叫另外一个人帮我回答,而我可以做其他的事情了,等他算好了告诉我。

如果讲解不对的,或者还有模糊的地方,欢迎在评论区互相探讨。

猜你喜欢

转载自blog.csdn.net/qq_23282479/article/details/80424946
今日推荐