C 多執行緒 非同步程式設計與併發伺服器

2021-07-25 13:49:09 字數 1804 閱讀 1145

一、多執行緒和非同步的區別

多執行緒和非同步操作兩者都可以達到避免呼叫執行緒阻塞的目的。但是,多執行緒和非同步操作還是有一些區別的。而這些區別造成了使用多執行緒和非同步操作的時機的區別。

當需要執行i/o操作時,使用非同步操作比使用執行緒+同步 i/o操作更合適。i/o操作不僅包括了直接的檔案、網路的讀寫,還包括資料庫操作、web service、httprequest以及.net remoting 等跨程序的呼叫。

執行緒適用那種需要長時間 cpu 運算的場合,例如耗時較長的圖形處理和演算法執行。

更多關於多執行緒和非同步的異同可以參考 這裡。

二、多執行緒程式設計

剛好這段時間在看網路程式設計,在這裡就結合多執行緒和網路程式設計,實現能夠應對多客戶端請求的服務端。socket 類的 accept() 方法一直等待,直到有客戶端連線請求。socket 網路程式設計可以參考c# 網路程式設計之 socket 程式設計 。

c# 中有專門的非同步網路程式設計方法,具體可以參考 幾種socket伺服器模型比較。

多執行緒實現乙個併發伺服器的例子:

static socket client;

static void main(string args)

}static private void senddata()

}

三、非同步程式設計

基於非同步的程式設計方法有三種

:task 非同步,有以下三種方法建立 task:

下面就以task.factory.startnew進行非同步程式設計實現乙個併發伺服器的例子:

static socket client;

static void main(string args)

); }

}static private void senddata()

}

使用async 與 await進行非同步程式設計

static socket client;

static socket server;

static void main(string args)

static async void accept()

static async task acceptasync() //非同步接受請求

}static async task senddata() //非同步發生資料

}

由於 main() 函式不能設定為 async 模式,所以增加了乙個accept 函式,使用 await 來執行非同步操作 acceptasync() ,等待接受客戶端的請求。同時在非同步操作 acceptasync() 中執行非同步 senddata() ,非同步傳送資料。

乙個問題:在上面的三個程式中,採用多執行緒和task.factory.startnew實現服務端的兩個程式,如果把下面兩段**作為子執行緒或者非同步函式執行,本來是阻塞的函式 client = server.accept(),卻沒有等待客戶端連線,直接執行過去了??是因為 accept()在同時在靜態函式和多執行緒中的關係????(因為在非靜態函式中這樣並沒有問題),但是使用async 與 await 執行的非同步函式卻能正常執行。

while (true)

while (true)

);}

C 併發程式設計 非同步程式設計與多執行緒

併發 同時做多件事情 多執行緒 併發的一種形式,它採用多個執行緒來執行程式。並行處理 把正在執行的大量的任務分割成小塊,分配給多個同時執行的執行緒。並行處理是多執行緒的一種,而多執行緒是併發的一種。非同步程式設計 併發的一種形式,它採用 future 模式或 callback 機制,以避免產生不必要...

併發伺服器模型 多執行緒伺服器

coding utf 8 from socket import from threading import thread from time import sleep 處理客戶端的請求並執行事情 def dealwithclient newsocket,destaddr while true rec...

多執行緒與併發伺服器設計 23 2

非同步i o 常見併發伺服器方案 linux能同時啟動多少個執行緒?對於 32 bit linux,乙個程序的位址空間是 4g,其中使用者態能訪問 3g 左右,而乙個執行緒的預設棧 stack 大小是 10m,心算可知,乙個程序大約最多能同時啟動 300 個執行緒左右。多執行緒能提高併發度嗎?如果指...