同步、异步
同步異步指的是通信模式
首先是通信的同步,主要是指客戶端在發送請求后,必須得在服務端有回應后才發送下一個請求。所以這個時候的所有請求將會在服務端得到同步?
其次是通信的異步,指客戶端在發送請求后,不必等待服務端的回應就可以發送下一個請求,這樣對于所有的請求動作來說將會在服務端得到異步,這條請求的鏈路就象是一個請求隊列,所有的動作在這里不會得到同步的。?
在實現過程中,如果服務端是異步的話,客戶端也是異步的話,通信效率會很高,但如果服務端在請求的返回時也是返回給請求的鏈路時,客戶端是可以同步的,這種情況下,服務端是兼容同步和異步的。相反,如果客戶端是異步而服務端是同步的也不會有問題,只是處理效率低了些。
同步
??????所謂同步,就是在發出一個功能調用時,在沒有得到結果之前,該調用就不返回。按照這個定義,其實絕大多數函數都是同步調用(例如sin, isdigit等)。但是一般而言,我們在說同步、異步的時候,特指那些需要其他部件協作或者需要一定時間完成的任務。最常見的例子就是 SendMessage。該函數發送一個消息給某個窗口,在對方處理完消息之前,這個函數不返回。當對方處理完畢以后,該函數才把消息處理函數所返回的 LRESULT值返回給調用者。
異步
??????異步的概念和同步相對。當一個異步過程調用發出后,調用者不能立刻得到結果。實際處理這個調用的部件在完成后,通過狀態、通知和回調來通知調用者。以 CAsycSocket類為例(注意,CSocket從CAsyncSocket派生,但是起功能已經由異步轉化為同步),當一個客戶端通過調用 Connect函數發出一個連接請求后,調用者線程立刻可以朝下運行。當連接真正建立起來以后,socket底層會發送一個消息通知該對象。這里提到執行 部件和調用者通過三種途徑返回結果:狀態、通知和回調。可以使用哪一種依賴于執行部件的實現,除非執行部件提供多種選擇,否則不受調用者控制。如果執行部 件用狀態來通知,那么調用者就需要每隔一定時間檢查一次,效率就很低(有些初學多線程編程的人,總喜歡用一個循環去檢查某個變量的值,這其實是一種很嚴重 的錯誤)。如果是使用通知的方式,效率則很高,因為執行部件幾乎不需要做額外的操作。至于回調函數,其實和通知沒太多區別。
總結
- 上一篇: 阻塞、非阻塞
- 下一篇: 基于Delphi API写的UDP通讯类