C 執行緒處理 三 執行緒池中的I O執行緒

2022-07-24 16:30:34 字數 4151 閱讀 9268

本筆記摘抄自:記錄一下方便資料查詢。

一、i/o執行緒實現對檔案的非同步

1.1 i/o執行緒介紹:

對於執行緒所執行的任務來說,可以把執行緒分為兩種型別:工作者執行緒和i/o執行緒。

工作者執行緒用來完成一些計算的任務,在任務執行的過程中,需要cpu不間斷地處理,所以,在工作者執行緒的執行過程中,cpu和執行緒的資源是充分利用的。

i/o執行緒主要用來完成輸入和輸出的工作,在這種情況下, 計算機需要i/o裝置完成輸入和輸出的任務。在處理過程中,cpu是不需要參與處理過程的,此時正在執行的執行緒

將處於等待狀態,只有等任務完成後才會有事可做, 這樣就造成執行緒資源浪費的問題。為了解決這樣的問題,可以通過執行緒池來解決這樣的問題,讓執行緒池來管理執行緒。

對於i/o執行緒,我們可以將輸入輸出操作分成三個步驟:啟動、實際輸入輸出、處理結果。用於實際輸入輸出可由硬體完成,並不需要cpu的參與,而啟動和處理結果也可以

不在同乙個執行緒上,這樣就可以充分利用執行緒資源。在.net中通過以begin開頭的方法來完成啟動,以end開頭的方法來處理結果,這兩個方法可以執行在不同的執行緒,這樣我們

就實現了非同步程式設計了。

1.2 .net中如何使用非同步

注意:

其實當我們呼叫begin開頭的方法,就是將乙個i/o執行緒排入到執行緒池中(由.net機制幫我們實現)。

注:工作者執行緒由執行緒池管理,直接呼叫threadpool.queueuserworkitem方法來將工作者執行緒排入到執行緒池中。

在.net framework中的fcl中有許多態別能夠對非同步操作提供支援,其中在filestream類中就提供了對檔案的非同步操作的方法。

filestream類要呼叫i/o執行緒要實現非同步操作,首先要建立乙個filestream物件,然後通過下面的建構函式來初始化filestream物件實現非同步操作(非同步讀取和非同步寫入):

public filestream (string path, filemode mode, fileaccess access, fileshare share,int buffersize,bool useasync)

其中path代表檔案的相對路徑或絕對路徑,mode代表如何開啟或建立檔案,access代表訪問檔案的方式,share代表檔案如何由程序共享,buffersize代表緩衝區的大小,

useasync代表使用非同步i/o還是同步i/o,設定為true時,表示使用非同步i/o。

下面**演示非同步寫入檔案:

class program

opened with asynchronously.", filestream.isasync ? "" : "not ");

byte writebytes = new byte[maxsize];

string writemessage = "an operation use asynchronous method to write message......";

writebytes = encoding.unicode.getbytes(writemessage);

console.writeline("message sizes is: bytes.\n", writebytes.length);

//呼叫非同步寫入方法將資訊寫入到檔案中

filestream.beginwrite(writebytes, 0, writebytes.length, new asynccallback(endwritecallback), filestream);

filestream.flush();

console.read();

#endregion

}/// /// 列印執行緒池資訊

///

///

private static void printmessage(string data)

\n currentthreadid is:\n currentthread is background:\n workerthreadnumber is:\n iothreadnumbers is:\n",

data,

thread.currentthread.managedthreadid,

thread.currentthread.isbackground.tostring(),

workthreadnumber.tostring(),

iothreadnumber.tostring());

}/// /// 當資料寫入檔案完成後呼叫此方法來結束非同步寫操作

///

///

private static void endwritecallback(iasyncresult asyncresult)

}

執行結果如下:

從執行結果可以看出,此時是呼叫執行緒池中的i/o執行緒去執行**函式的,同時在專案的bin\debug檔案目錄下生成了乙個test.txt檔案。

下面**演示非同步讀取檔案:

class program

/// /// 列印執行緒池資訊

///

///

private static void printmessage(string data)

\n currentthreadid is:\n currentthread is background:\n workerthreadnumber is:\n iothreadnumbers is:\n",

data,

thread.currentthread.managedthreadid,

thread.currentthread.isbackground.tostring(),

workthreadnumber.tostring(),

iothreadnumber.tostring());

}/// /// 當資料讀取檔案完成後呼叫此方法來結束非同步寫操作

///

///

private static void endreadcallback(iasyncresult asyncresult)

string readmessage = encoding.unicode.getstring(readbytes, 0, readlength);

console.writeline("read message is :" + readmessage);

readstream.close();}}

執行結果如下:

二、i/o執行緒實現對請求的非同步

我們同樣可以利用i/o執行緒來模擬瀏覽器對伺服器請求的非同步操作,在.net類庫中的webrequest類提供了非同步請求的支援。

下面**演示非同步請求:

class program

/// /// 列印執行緒池資訊

///

///

private static void printmessage(string data)

\n currentthreadid is:\n currentthread is background:\n workerthreadnumber is:\n iothreadnumbers is:\n",

data,

thread.currentthread.managedthreadid,

thread.currentthread.isbackground.tostring(),

workthreadnumber.tostring(),

iothreadnumber.tostring());

}/// /// web請求**函式

///

///

private static void processwebresponse(iasyncresult result)}}

執行結果如下:

C 多執行緒程式設計 三 執行緒間通訊

七 執行緒間通訊 一般而言,應用程式中的乙個次要執行緒總是為主執行緒執行特定的任務,這樣,主線程和次要執行緒間必定有乙個資訊傳遞的渠道,也就是主線程和次要執行緒間要進行通訊。這種執行緒間的通訊不但是難以避免的,而且在多執行緒程式設計中也是複雜和頻繁的,下面將進行說明。使用全域性變數進行通訊 由於屬於...

執行緒實用解析 (三)執行緒的同步

上一節主要講了建立呼叫有參 多參 函式的執行緒和執行緒池的一些內容,這一節主要講執行緒的同步。多執行緒的出現解決了吞吐量和響應速度的問題,但同時也帶來了資源共享問題,如死鎖和資源爭用。在為單個資源分配多個執行緒可能會導致同步問題。何為執行緒同步呢?所謂同步,是指多個執行緒之間存在先後執行順序的關聯關...

多執行緒學習(三) 執行緒的屬性

屬性名稱 用途注意事項 id每個執行緒都有自己的id,用於識別不同的執行緒 被後續建立的執行緒使用 不允許被修改 name 便於使用者在開發 除錯或執行過程中區分每個不同的執行緒 定位問題等 清晰有意義的名字 預設的名稱 isdaemon true 代表是守護執行緒,false 非守護執行緒 使用者...