C 用委託實現非同步,非同步與多執行緒的異同

2022-04-03 20:20:18 字數 3446 閱讀 3987

多執行緒和非同步操作的異同

多執行緒和非同步操作兩者都可以達到避免呼叫執行緒阻塞的目的,從而提高軟體的可響應性。甚至有些時候我們就認為多執行緒和非同步操作是等同的概念。但是,多執行緒和非同步操作還是有一些區別的。而這些區別造成了使用多執行緒和非同步操作的時機的區別。

非同步操作的本質

所有的程式最終都會由計算機硬體來執行,所以為了更好的理解非同步操作的本質,我們有必要了解一下它的硬體基礎。 熟悉電腦硬體的朋友肯定對dma這個詞不陌生,硬碟、光碟機的技術規格中都有明確dma的模式指標,其實網絡卡、音效卡、顯示卡也是有dma功能的。dma就是直 接記憶體訪問的意思,也就是說,擁有dma功能的硬體在和記憶體進行資料交換的時候可以不消耗cpu資源。只要cpu在發起資料傳輸時傳送乙個指令,硬體就開 始自己和記憶體交換資料,在傳輸完成之後硬體會觸發乙個中斷來通知操作完成。這些無須消耗cpu時間的i/o操作正是非同步操作的硬體基礎。所以即使在dos 這樣的單程序(而且無線程概念)系統中也同樣可以發起非同步的dma操作。

執行緒的本質

執行緒不是乙個計算機硬體的功能,而是作業系統提供的一種邏輯功能,執行緒本質上是程序中一段併發執行的**,所以執行緒需要作業系統投入cpu資源來執行和排程。

非同步操作的優缺點

因為非同步操作無須額外的執行緒負擔,並且使用**的方式進行處理,在設計良好的情況下,處理函式可以不必使用共享變數(即使無法完全不用,最起碼可以減少 共享變數的數量),減少了死鎖的可能。當然非同步操作也並非完美無暇。編寫非同步操作的複雜程度較高,程式主要使用**方式進行處理,與普通人的思維方式有些 初入,而且難以除錯。

多執行緒的優缺點

多執行緒的優點很明顯,執行緒中的處理程式依然是順序執行,符合普通人的思維習慣,所以程式設計簡單。但是多執行緒的缺點也同樣明顯,執行緒的使用(濫用)會給系統帶來上下文切換的額外負擔。並且執行緒間的共享變數可能造成死鎖的出現。

適用範圍

在了解了執行緒與非同步操作各自的優缺點之後,我們可以來**一下執行緒和非同步的合理用途。我認為:當需要執行i/o操作時,使用非同步操作比使用執行緒+同步 i/o操作更合適。i/o操作不僅包括了直接的檔案、網路的讀寫,還包括資料庫操作、web service、httprequest以及.net remoting等跨程序的呼叫。

而執行緒的適用範圍則是那種需要長時間cpu運算的場合,例如耗時較長的圖形處理和演算法執行。但是往 往由於使用執行緒程式設計的簡單和符合習慣,所以很多朋友往往會使用執行緒來執行耗時較長的i/o操作。這樣在只有少數幾個併發操作的時候還無傷大雅,如果需要處 理大量的併發操作時就不合適了。

非同步呼叫並不是要減少執行緒的開銷, 它的主要目的是讓呼叫方法的主線程不需要同步等待在這個函式呼叫上, 從而可以讓主線程繼續執行它下面的**.與此同時, 系統會通過從threadpool中取乙個執行緒來執行,幫助我們將我們要寫/讀的資料傳送到網絡卡.由於不需要我們等待, 我們等於同時做了兩件事情. 這個效果跟自己另外啟動乙個執行緒來執行等待方式的寫操作是一樣的.但是, 非同步執行緒可以利用作業系統/.net的執行緒池, 系統可以根據吞吐量動態的管理執行緒池的大小.

非同步有的時候用普通的執行緒,有的時候用系統的非同步呼叫功能。有一些io操作也是非同步的,但是未必需要乙個執行緒來執行。例如:硬體是有dma功能的,在呼叫dma傳輸資料的時候,cpu是不需要執行處理的,只需要發起傳輸和等待傳輸結束即可。具體到.net平台,比如socket的beginsend,如果是執行在windows    2000以後的平台,在底層就會呼叫非同步的完成埠來傳送。

.net中的非同步執行其實使用的是非同步委託。非同步委託將要執行的方法提交到.net的執行緒池,由執行緒池中的執行緒來執行非同步方法。

非同步執行也得執行,不在當前執行緒執行,當然得去另外乙個執行緒執行。非同步通常用系統執行緒池的執行緒,通常情況下效能好些。(因為可以多次利用,申請時不需要重新申請乙個執行緒,只需要從池裡取就行了。)非同步是一種效果,多執行緒是一種具體技術。可以說,用「多執行緒」實現「非同步」。

非同步和多執行緒是兩個不同的概念,不能這樣比較.非同步請求一般用在io等耗時操作上,他的好處是函式呼叫立即返回,相應的工作執行緒立即返還給系統以供重用。由於系統的執行緒資源是非常寶貴的,通常有一定的數目限制,如.net預設是25。若使用非同步方式,用這些固定數目的執行緒在固定的時間內就可以服務更多的請求,而如果用同步方式,那麼每個請求都自始至終占用這乙個執行緒,伺服器可以同時服務的請求數就少了。當非同步操作執行完成後,系統會從可用執行緒中選取乙個執行**程式,這時的這個執行緒可能是剛開始發出請求的那個執行緒,也可能是其他的執行緒,因為系統選取執行緒是隨機的事情,所以不能說絕對不是剛開始的那個執行緒。多執行緒是用來併發的執行多個任務。

不過有個問題,非同步有時優先順序比主線程還高。這個特點和多執行緒不同。

委託實現非同步的詳細**、與說明,如以下**,

我看了,寫的不錯,但是還是有些沒有解析的更清楚。如(iasyncresult)。

非同步呼叫並不是要減少執行緒的開銷, 它的主要目的是讓呼叫方法的主線程不需要同步等待在這個函式呼叫上, 從而可以讓主線程繼續執行它下面的**.與此同時, 系統會通過從threadpool中取乙個執行緒來執行,幫助我們將我們要寫/讀的資料傳送到網絡卡.由於不需要我們等待, 我們等於同時做了兩件事情. 這個效果跟自己另外啟動乙個執行緒來執行等待方式的寫操作是一樣的.但是, 非同步執行緒可以利用作業系統/.net的執行緒池, 系統可以根據吞吐量動態的管理執行緒池的大小.

非同步有的時候用普通的執行緒,有的時候用系統的非同步呼叫功能。有一些io操作也是非同步的,但是未必需要乙個執行緒來執行。例如:硬體是有dma功能的,在呼叫dma傳輸資料的時候,cpu是不需要執行處理的,只需要發起傳輸和等待傳輸結束即可。具體到.net平台,比如socket的beginsend,如果是執行在windows    2000以後的平台,在底層就會呼叫非同步的完成埠來傳送。

.net中的非同步執行其實使用的是非同步委託。非同步委託將要執行的方法提交到.net的執行緒池,由執行緒池中的執行緒來執行非同步方法。

非同步執行也得執行,不在當前執行緒執行,當然得去另外乙個執行緒執行。非同步通常用系統執行緒池的執行緒,通常情況下效能好些。(因為可以多次利用,申請時不需要重新申請乙個執行緒,只需要從池裡取就行了。)非同步是一種效果,多執行緒是一種具體技術。可以說,用「多執行緒」實現「非同步」。

非同步和多執行緒是兩個不同的概念,不能這樣比較.非同步請求一般用在io等耗時操作上,他的好處是函式呼叫立即返回,相應的工作執行緒立即返還給系統以供重用。由於系統的執行緒資源是非常寶貴的,通常有一定的數目限制,如.net預設是25。若使用非同步方式,用這些固定數目的執行緒在固定的時間內就可以服務更多的請求,而如果用同步方式,那麼每個請求都自始至終占用這乙個執行緒,伺服器可以同時服務的請求數就少了。當非同步操作執行完成後,系統會從可用執行緒中選取乙個執行**程式,這時的這個執行緒可能是剛開始發出請求的那個執行緒,也可能是其他的執行緒,因為系統選取執行緒是隨機的事情,所以不能說絕對不是剛開始的那個執行緒。多執行緒是用來併發的執行多個任務。

不過有個問題,非同步有時優先順序比主線程還高。這個特點和多執行緒不同。

委託實現非同步的詳細**、與說明,如以下**,

我看了,寫的不錯,但是還是有些沒有解析的更清楚。如(iasyncresult)。

C 用委託BeginInvoke做非同步執行緒

乙個應用場景,瀏覽器上傳乙個檔案,此檔案後台呼叫檔案轉換,需要耗費相當長的時間,這樣,如果是乙個執行緒同步式的做下去,那麼使用者在瀏覽器上感覺就是卡住了,卡卡卡卡,這裡我們利用委託的begininvoke和endinvoke方法操作執行緒,begininvoke方法可以使用執行緒非同步地執行委託所指...

c 委託非同步實現

同步執行模式,是指語句在同步執行模式下,將始終保持對程式流的控制,直至程式結束。例如查詢操作,客戶機上的應用程式在向伺服器發出查詢操作的指令後,將一直等待伺服器將查詢結果返回客戶機端後,才繼續進行下一步操作 非同步執行模式,是指語句在非同步執行模式下,各語句執行結束的順序與語句執行開始的順序並不一定...

多執行緒與非同步

基於任務的非同步程式設計模型 tap 提供了非同步 的抽象化。你只需像往常一樣將 編寫為一連串語句即可。就如每條語句在下一句開始之前完成一樣,你可以流暢地閱讀 編譯器將執行許多轉換,因為其中一些語句可能會開始執行並返回表示正在進行的工作的 task。這就是此語法的目標 支援讀起來像一連串語句的 但會...