C#執行緒同步Barrier
阿新 • • 發佈:2018-12-07
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()來增加或者減少需要等待的訊號數量