C 執行緒會合例項

2022-01-22 13:59:29 字數 2268 閱讀 9141

有這樣乙個題目:四個執行緒t1,t2,t3,t4,向4個檔案中寫入資料,要求:t1只能寫入「1」,t2只能寫入「2」,t3只能寫入「3」,t4只能寫入「4」,對4個檔案a,b,c,d寫入如下內容:

簡單分析一下,對於a檔案,t1寫入「1」後,我們希望通知t2來寫「2」,並且t1前往d檔案等著去寫「1」,以此類推。

1. 通過等待控制代碼實現

顯然可以用等待控制代碼來實現,通知t2來寫「2」相當於在乙個等待控制代碼上呼叫 set 方法,等待在d檔案上寫「1」相當於在另一等待控制代碼上呼叫了 waitone 方法,下邊是利用4個 autoresetevent 來實現它:

class

program

;

//建立或清空檔案

filenames.foreach(name =>

});//為每個檔案寫入建立乙個等待控制代碼

_whs = filenames.select(name => new autoresetevent(false

)).tolist();

//建立並啟4個執行緒執行任務

var threads = new list;

threads.foreach(t =>t.start());

//等待執行緒結束並關閉 streamwrite

threads.foreach(t =>t.join());

console.writeline(

"任務完成!");

_sws.foreach(sw =>sw.close());

}static

void work(int

threadindex)

next = (next - 1) < 0 ? 3 : next - 1

; waithandle.signalandwait(wh, _whs[next]);

//在wh上發訊號,並在下乙個等待控制代碼上等待執行

} }

}

上述例子中我們建立了4個執行緒來分別列印1,2,3,4,並且為每個檔案的寫入建立了4個等待控制代碼來進行訊號通訊。最後主線程在等待所有執行緒結束後,關閉檔案流。為讓程式能正常結束,在 work 方法中就只迴圈寫100次。

以t1(列表中第乙個執行緒)為例,在a檔案中列印1後,呼叫 waithandle.signalandwait(wh,wh[next]),即在wh上發訊號通知可以接著寫入了,並在下乙個等待控制代碼上等待寫入訊號。

關於 sinalandwait 的可以參見 thread in c# 或者對應的 中文翻譯 。

2. 通過 barrier 類實現

除了通過等待控制代碼可以實現題目要求外,同樣可以通過 wait 和 pulse 來實現。如果是framework 4.0或更高的版本,可以通過 barrier 類(它是建立在 wait / pulse 和自旋鎖基礎上的)更簡單的實現這個題目。

class

program

;

//建立或清空檔案

filenames.foreach(name =>

});//在_barrier上呼叫signalandwait的執行緒會被阻塞直到這個方法被呼叫4次

_barrier = new barrier(4

);

//建立並啟4個執行緒執行任務

var threads = new list;

threads.foreach(t =>t.start());

//等待執行緒結束並關閉 streamwrite

threads.foreach(t =>t.join());

console.writeline(

"任務完成!");

_sws.foreach(sw =>sw.close());

}static

void work(int

threadindex)

_barrier.signalandwait();

next = (next - 1) < 0 ? 3 : next - 1

; }}}

使用了乙個 barrier 類來替代4個等待控制代碼,執行緒呼叫 signalandwait 後會阻塞,直到這個方法被呼叫4次。在這個例子中意味著4個執行緒總是在同步進行著列印,下圖可以很好的解釋 barrier 類:

關於 barrier 類,可以參見 thread in c# 或者對應的 中文翻譯 。

C 執行緒程式設計例項

直接 static void main string args 1 初始的sendemailmethod方法 public static void sendemailmethod int maxcount,int threadcount 每組數量 int groupcount datalist.co...

C 執行緒 第四執行緒例項

場景 系統中常常會有一些需要定時去迴圈執行的儲存過程或方法等,這時就出現了定時任務小程式。模型 查詢需定時執行的計畫任務 插入執行緒池 執行任務 static void mainmethod 查詢計畫任務 static void querytask threadpool.queueuserworki...

C 執行緒 Threading 程式設計 例項

手頭乙個專案中,使用到多執行緒例,分配任務,處理任務,顯示任務狀態,等.by shelly using system using system.threading using system.collections namespace sharethread b thread.sleep 200 pu...