1. 程式人生 > >C#執行緒同步Barrier

C#執行緒同步Barrier

Barrier中提供了一個回撥函式,每個執行緒呼叫SignalAndWait方法後該回調函式會被執行。
eg:

static Barrier _barrier = new Barrier(3, b => Console.WriteLine("1"));

在上面我們初始化了一個Barrier,並在構造中設定為將等待的訊號數量為3,這就意味著如何想好執行回撥函式Console.WriteLine("1"),則需要線上程中執行三次_barrier.SignalAndWait();這樣才能釋放執行緒並執行回撥函式
下面舉個例子

 static Barrier _barrier =
new Barrier(2, b => Console.WriteLine("End of phase {0}", b.CurrentPhaseNumber + 1)); static void PlayMusic(string name ,int seconds) { for(int i = 1; i < 3; i++) { Console.WriteLine("--------------------"); Thread.Sleep(TimeSpan.
FromSeconds(seconds)); Console.WriteLine("{0}執行緒啟動",name); Thread.Sleep(TimeSpan.FromSeconds(seconds)); Console.WriteLine("{0}執行緒完成",name); _barrier.SignalAndWait(); } } static void Main(string[] args) {
var t1 = new Thread(() => PlayMusic("a", 5)); var t2 = new Thread(() => PlayMusic("b", 2)); t1.Start(); t2.Start(); Console.ReadKey(); }

我們直接來看看執行的情況
在這裡插入圖片描述
很明顯要想Barrier中的回撥函式並釋放執行緒,必須呼叫兩次_barrier.SignalAndWait();,程式碼中在a執行緒呼叫了一次,b執行緒呼叫了一次,Barrier訊號量未到達2時將一直處於阻塞狀態。

在程式的執行過程中,可以通過成員函式AddParticipant()和RemoveParticpant()來增加或者減少需要等待的訊號數量