[.net 多線程]Barrier
阿新 • • 發佈:2018-05-18
.html art lan 技術 bsp com ase 並行 public
當需要【一組任務】並行地運行一連串的階段,但是每一個階段都要等待所有他任務完成前一階段之後才能開始,可以通過Barrier實例來同步這一類協同工作。
Barrier初始化後,將等待特定數量的信號到來,這個數量在Barrier初始化時指定,在所指定的信號個數已經到來後,Barrier將執行一個指定的動作,這個動作也是在Barrier初始化時指定。Barrier在執行動作過後,將會重置,這時又將等待特定數量的信號到來,再執行指定動作。信號通過成員函數SignalAndWait()來發送,執行SignalAndWait()函數的Task或者線程將會投入等待,Barrier將等待特定數量的信號到達,然後Barrier執行完指定動作後被重置,這時SignalAndWait()函數所在的Task或者線程將繼續運行。在程序的運行過程中,可以通過成員函數AddParticipant()和RemoveParticpant()來增加或者減少需要等待的信號數量
1 public static void Phase1(int taskId) 2 { 3 Console.WriteLine($"Task[{taskId}] complete phase1"); 4 } 5 public static void Phase2(int taskId) 6 { 7 Console.WriteLine($"Task[{taskId}] complete phase2"); 8 } 9 public static void Phase3(int taskId) 10 { 11 Console.WriteLine($"Task[{taskId}] complete phase3Barrier示例"); 12 } 13 public static void Phase4(int taskId) 14 { 15 Console.WriteLine($"Task[{taskId}] complete phase4"); 16 } 17 static void Main(string[] args) 18 { 19 Barrier barrier = new Barrier(3); 20 int taskId = 0; 21 for (int i = 0; i < 3; i++) 22 { 23 Task.Factory.StartNew(() => 24{ 25 int cur = Interlocked.Increment(ref taskId); 26 Phase1(cur); 27 barrier.SignalAndWait(); 28 Phase2(cur); 29 barrier.SignalAndWait(); 30 Phase3(cur); 31 barrier.SignalAndWait(); 32 Phase4(cur); 33 barrier.SignalAndWait(); 34 }); 35 } 36 Console.ReadKey(); 37 }
任務執行流程如下:
執行結果:
Task1/Task2/Task3在phase1都執行完後,才會接著執行phase2
Barrier代碼實現分析:https://www.cnblogs.com/majiang/p/7898027.html
[.net 多線程]Barrier