阻塞非阻塞和同步異步的區別


老張愛喝茶,廢話不說,煮開水。
出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。
1 老張把水壺放到火上,立等水開。(同步阻塞)
老張覺得自己有點傻
2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。(同步非阻塞)
老張還是覺得自己有點傻,於是變高端了,買了把會響笛的那種水壺。水開之后,能大聲發出嘀~~~~的噪音。
3 老張把響水壺放到火上,立等水開。(異步阻塞)
老張覺得這樣傻等意義不大
4 老張把響水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(異步非阻塞)
老張覺得自己聰明了。
所謂同步異步,只是對於水壺而言。
普通水壺,同步;響水壺,異步。
雖然都能干活,但響水壺可以在自己完工之后,提示老張水開了。這是普通水壺所不能及的。
同步只能讓調用者去輪詢自己(情況2中),造成老張效率的低下。
所謂阻塞非阻塞,僅僅對於老張而言。
立等的老張,阻塞;看電視的老張,非阻塞。
情況1和情況3中老張就是阻塞的,媳婦喊他都不知道。雖然3中響水壺是異步的,可對於立等的老張沒有太大的意義。所以一般異步是配合非阻塞使用的,這樣才能發揮異步的效用。——來源網絡,作者不明。
作者:愚抄
鏈接:https://www.zhihu.com/question/19732473/answer/23434554
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

 

今天突然發現自己對同步異步,阻塞非阻塞有點不理解。總會覺得同步跟阻塞是同一個東西,異步跟非阻塞是同一個東西。於是乎搜到了上面那個文章我覺得很有意思,淺顯易懂。

下面是我自己的理解:
比如我在線程A中調用了fun()函數。
同步/異步:針對的被調用者的狀態。也就是fun函數。(也就是上面的燒水壺)
同步是指fun如果沒有結果就不會返回,除非有結果了。
異步是指fun在被調用之后就立即返回了。返回結果之后再通知調用者(可以用信號、回調之類的實現)。

阻塞/非阻塞:主要是針對調用者的,是指程序在等待結果時的狀態。(也就是上面的老張在等水開時的狀態)
阻塞是指調用線程會被掛起,不做什么別的事情。在得到結果之后才會返回。
非阻塞是指不能立即得到結果,當前線程不會被掛起,還可以做別的事情。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM