1. 程式人生 > >[.net 多線程]Barrier

[.net 多線程]Barrier

.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 phase3
"); 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 }
Barrier示例

任務執行流程如下:

技術分享圖片

執行結果:

技術分享圖片

Task1/Task2/Task3在phase1都執行完後,才會接著執行phase2

Barrier代碼實現分析:https://www.cnblogs.com/majiang/p/7898027.html

[.net 多線程]Barrier