非同步,同步,阻塞,非阻塞個人理解

2021-06-20 08:01:52 字數 1175 閱讀 4602

同步

所謂同步,就是函式在發出乙個功能呼叫過程時,在過程沒有完成結束前,函式也是得不到返回的。按照這個定義,其實絕大多數函式都是同步呼叫(例如sin, isdigit等)。但是一般而言,我們在說同步、非同步的時候,特指的是那些需要其他部件協作或者需要一定時間完成的任務。最常見的例子就是 sendmessage。該函式傳送乙個訊息給某個視窗,在對方處理完訊息之前(即是乙個過程),這個函式不返回。當對方處理完畢以後,該函式才把訊息處理函式所返回的 lresult值返回給呼叫者。 非同步

就是函式在發出乙個功能呼叫過程時,在過程沒有完成結束前,函式也立即返回。以 casycsocket類為例(注意,csocket從casyncsocket派生,但是起功能已經由非同步轉化為同步),當乙個客戶端通過呼叫 connect函式發出乙個連線請求後,呼叫者執行緒立刻可以朝下執行。當連線真正建立起來以後,socket底層會傳送乙個訊息通知該物件。postmessage()函式也是傳送訊息後立即返回的非同步函式機制。

對同步與非同步認識的形象例子:比如你住在一棟樓第三層,在上樓梯經過第二層時,要敲門給第二層乙個阿姨東西。同步即是敲了門(發出訊息),要等到阿姨從房裡走出來並開門接了東西(訊息處理過程),你才能繼續上你住的第三層;而非同步則是敲了門(傳送訊息),不等到阿姨從房裡走出來並開門接了東西(訊息處理過程),放下東西,就直接上你住的第三層。

阻塞與非阻塞的區別:用例子send與recv兩個函式來說明

呼叫函式傳送一定的byte,在系統內部做的工作其實只是把資料傳輸(copy)到tcp/ip協議棧的輸出緩衝區,它執行成功並不代表資料已經成功的傳送出去了,如果tcp/ip協議棧沒有足夠的可用緩衝區來儲存你copy過來的資料的話,這時候就體現出阻塞和非阻塞的不同之處了:對於阻塞模式的socket的send()函式將不返回直到系統緩衝區有足夠的空間把你要傳送的資料copy過去以後才返回,而對於非阻塞的socket的send()來說會立即返回wsaewoulddblock告訴呼叫者說:「傳送操作被阻塞了」,當然之後緩衝區夠了還是傳送出去了的,所以在通訊程式設計時,這個不是個錯誤。對於recv()函式,同樣道理,該函式的內部工作機制其實是在等待tcp/ip協議棧的接收緩衝區通知它說:「你的資料來了,對於阻塞模式的socket來說如果tcp/ip協議棧的接收緩衝區沒有通知乙個結果給它它就一直不返回:耗費著系統資源。。。而對於非阻塞模式的socket該函式會馬上返回,然後告訴你:「wsaewoulddblock,現在沒有資料。。。」

另外mfc通訊程式設計兩個類的說明:

同步 非同步,阻塞 非阻塞理解

由於同步非同步,阻塞非阻塞都學習了有一段時間了。慢慢了快忘了,所以乾脆趁著寒假把知識點都撿起來,寫出來。同步和非同步是一組概念,阻塞和非阻塞是一組概念。大家不要搞混了,不要把同步和阻塞等價,也不要把非同步和非阻塞等價 戲說不是胡說,改編不是亂編 滑稽 在剛開始理解的時候很容易搞混,我們這樣想,同步和...

個人對同步非同步,阻塞非阻塞的理解

以下內容純屬個人理解,如有錯誤,歡迎指出討論 我們經常把同步非同步,阻塞非阻塞,當作單獨的兩個塊來理解,就單獨針對同步非同步理解起來不難,單獨針對阻塞非阻塞理解起來似乎也不難 但是兩個塊放到一起理解似乎總有點含糊不清的感覺 然後有人得出 同步就阻塞,非同步就非阻塞 的錯誤觀念 說個我覺得比較好理解但...

怎樣理解 同步 非同步 阻塞 非阻塞

老張愛喝茶,廢話不說,煮開水。出場人物 老張,水壺兩把 普通水壺,簡稱水壺 會響的水壺,簡稱響水壺 1 老張把水壺放到火上,立等水開。同步阻塞 老張覺得自己有點傻 2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。同步非阻塞 老張還是覺得自己有點傻,於是變高階了,買了把會響笛的那種水壺...