C#多執行緒程式設計筆記(2.6)-使用Barrier類
阿新 • • 發佈:2019-02-07
近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^
using System; using System.Threading; namespace Barrier_Test { class Program { static void Main(string[] args) { var t1 = new Thread(() => PlayMusic("the guitarist", "play an amazing solo", 5)); var t2 = new Thread(() => PlayMusic("the singer", "sing the song", 2)); t1.Start(); t2.Start(); Console.ReadKey(); } static Barrier _barrier = new Barrier(2, b => Console.WriteLine("End of phase {0}", b.CurrentPhaseNumber + 1)); static void PlayMusic(string name,string message,int seconds) { for (int i = 1; i < 3; i++) { Console.WriteLine("---------------------------------------------"); Thread.Sleep(TimeSpan.FromSeconds(seconds)); Console.WriteLine("{0} starts to {1}", name, message); Thread.Sleep(TimeSpan.FromSeconds(seconds)); Console.WriteLine("{0} finishes to {1}", name, message); _barrier.SignalAndWait(); } } } }
程式執行結果如下
我們建立了Barrier類,指定了我們想要同步兩個執行緒,在兩個執行緒中的任何一個呼叫了_barrier.SignalAndWait方法後,會執行一個回撥函式來打印出階段。
每個執行緒將向Barrier傳送兩次訊號,所以會有兩個階段。每次這兩個執行緒呼叫SignalAndWait方法時,Barrier將會執行回撥函式。這在多執行緒迭代運算中非常有用,可以在每個迭代結束前執行一些計算。當最後一個執行緒呼叫SignalAndWait方法時可以在迭代結束時進行互動。