1. 程式人生 > >C#多執行緒程式設計筆記(2.6)-使用Barrier類

C#多執行緒程式設計筆記(2.6)-使用Barrier類

近來在學習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方法時可以在迭代結束時進行互動。