有這樣乙個題目:四個執行緒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上述例子中我們建立了4個執行緒來分別列印1,2,3,4,並且為每個檔案的寫入建立了4個等待控制代碼來進行訊號通訊。最後主線程在等待所有執行緒結束後,關閉檔案流。為讓程式能正常結束,在 work 方法中就只迴圈寫100次。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上發訊號,並在下乙個等待控制代碼上等待執行
} }
}
以t1(列表中第乙個執行緒)為例,在a檔案中列印1後,呼叫 waithandle.signalandwait(wh,wh[next]),即在wh上發訊號通知可以接著寫入了,並在下乙個等待控制代碼上等待寫入訊號。
關於 sinalandwait 的可以參見 thread in c# 或者對應的 中文翻譯 。
2. 通過 barrier 類實現
除了通過等待控制代碼可以實現題目要求外,同樣可以通過 wait 和 pulse 來實現。如果是framework 4.0或更高的版本,可以通過 barrier 類(它是建立在 wait / pulse 和自旋鎖基礎上的)更簡單的實現這個題目。
class使用了乙個 barrier 類來替代4個等待控制代碼,執行緒呼叫 signalandwait 後會阻塞,直到這個方法被呼叫4次。在這個例子中意味著4個執行緒總是在同步進行著列印,下圖可以很好的解釋 barrier 類: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 類,可以參見 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...