<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
這一篇,我們將學習用於實現並行任務、使得多個執行緒有序同步完成多個階段的任務。
應用場景主要是控制 N 個執行緒(可隨時增加或減少執行的執行緒),使得多執行緒在能夠在 M 個階段中保持同步。
執行緒工作情況如下:
我們接下來 將學習C# 中的 Barrier ,用於實現並行協同工作。
使多個任務能夠採用並行方式依據某種演演算法在多個階段中協同工作,使多個執行緒(稱為“參與者” )分階段同時處理演演算法。
可以使多個執行緒(稱為“參與者” )分階段同時處理演演算法。(注意演演算法這個詞)
每個參與者完成階段任務後後將被阻止繼續執行,直至所有參與者都已達到同一階段。
Barrier 的建構函式如下:
建構函式 | 說明 |
---|---|
Barrier(Int32) | 初始化 Barrier 類的新範例。 |
Barrier(Int32, Action) | 初始化 Barrier 類的新範例。 |
其中一個建構函式定義如下:
public Barrier (int participantCount, Action<Barrier> postPhaseAction);
participantCount :處於的執行緒數量,大於0並且小於32767。
postPhaseAction :在每個階段後執行 Action(委託)。
在還沒有清楚這個類有什麼作用前,我們來看一下這個類的常用屬性和方法。
大概瞭解 Barrier 有哪些常用屬性和方法後,我們開始編寫範例程式碼。
屬性:
屬性 | 說明 |
---|---|
CurrentPhaseNumber | 獲取屏障的當前階段的編號。 |
ParticipantCount | 獲取屏障中參與者的總數。 |
ParticipantsRemaining | 獲取屏障中尚未在當前階段發出訊號的參與者的數量。 |
方法:
方法 | 說明 |
---|---|
AddParticipant() | 通知 Barrier,告知其將會有另一個參與者。 |
AddParticipants(Int32) | 通知 Barrier,告知其將會有多個其他參與者。 |
RemoveParticipant() | 通知 Barrier,告知其將會減少一個參與者。 |
RemoveParticipants(Int32) | 通知 Barrier,告知其將會減少一些參與者。 |
SignalAndWait() | 發出參與者已達到屏障並等待所有其他參與者也達到屏障。 |
SignalAndWait(CancellationToken) | 發出參與者已達到屏障的訊號,並等待所有其他參與者達到屏障,同時觀察取消標記。 |
SignalAndWait(Int32) | 發出參與者已達到屏障的訊號,並等待所有其他參與者也達到屏障,同時使用 32 位帶符號整數測量超時。 |
SignalAndWait(Int32, CancellationToken) | 發出參與者已達到屏障的訊號,並等待所有其他參與者也達到屏障,使用 32 位帶符號整數測量超時,同時觀察取消標記。 |
SignalAndWait(TimeSpan) | 發出參與者已達到屏障的訊號,並等待所有其他參與者也達到屏障,同時使用 TimeSpan 物件測量時間間隔。 |
SignalAndWait(TimeSpan, CancellationToken) | 發出參與者已達到屏障的訊號,並等待所有其他參與者也達到屏障,使用 TimeSpan 物件測量時間間隔,同時觀察取消標記。 |
Barrier 翻譯屏障,前面所說的 “階段”,在檔案中稱為屏障,官方有一些例子和實踐場景:
https://docs.microsoft.com/zh-cn/dotnet/standard/threading/barrier?view=netcore-3.1
本文的教學比較簡單,你可以先看本教學,再去看看官方範例。
假設有個比賽,一個有三個環節,有三個小組參加比賽。
比賽有三個環節,小組完成一個環節後,可以去等待區休息,等待其他小組也完成比賽後,開始進行下一個環節的比賽。
範例如下:
new Barrier(int,Action)
設定有多少執行緒參與,Action 委託設定每個階段完成後執行哪些動作。
.SignalAndWait()
阻止當前執行緒繼續往下執行;直到其他完成也執行到此為止。
class Program { // Barrier(Int32, Action) private static Barrier barrier = new Barrier(3, b => Console.WriteLine($"n第 {b.CurrentPhaseNumber + 1} 環節的比賽結束,請評分!")); static void Main(string[] args) { // Random 模擬每個小組完成一個環節比賽需要的時間 Thread thread1 = new Thread(() => DoWork("第一小組", new Random().Next(2, 10))); Thread thread2 = new Thread(() => DoWork("第二小組", new Random().Next(2, 10))); Thread thread3 = new Thread(() => DoWork("第三小組", new Random().Next(2, 10))); // 三個小組開始比賽 thread1.Start(); thread2.Start(); thread3.Start(); Console.ReadKey(); } static void DoWork(string name, int seconds) { // 第一環節 Console.WriteLine($"n{name}:開始進入第一環節比賽"); Thread.Sleep(TimeSpan.FromSeconds(seconds)); // 模擬小組完成環節比賽需要的時間 Console.WriteLine($"n {name}:完成第一環節比賽,等待其它小組"); // 小組完成階段任務,去休息等待其它小組也完成比賽 barrier.SignalAndWait(); // 第二環節 Console.WriteLine($"n {name}:開始進入第二環節比賽"); Thread.Sleep(TimeSpan.FromSeconds(seconds)); Console.WriteLine($"n {name}:完成第二環節比賽,等待其它小組n"); barrier.SignalAndWait(); // 第三環節 Console.WriteLine($"n {name}:開始進入第三環節比賽"); Thread.Sleep(TimeSpan.FromSeconds(seconds)); Console.WriteLine($"n {name}:完成第三環節比賽,等待其它小組n"); barrier.SignalAndWait(); } }
上面的範例中,每個執行緒都使用了 DoWork()
這個方法去中相同的事情,當然也可以設定多個執行緒執行不同的任務,但是必須保證每個執行緒都具有相同數量的 .SignalAndWait();
方法。
當然 SignalAndWait()
可以設定等待時間,如果其他執行緒遲遲沒有到這一步,那就繼續執行。可以避免死鎖等問題。
到目前,只使用了 SignalAndWait()
,我們繼續學習一下 Barrier 類的其他方法。
Barrier.AddParticipant()
:新增參與者;
Barrier.RemoveParticipant()
:移除參與者;
這裡繼續使用第二節的範例。
因為這是比賽,老是等待其他小組,會使得比賽進行比較慢。
新的規則:不必等待最後一名,當環節只剩下最後一名時為完成時,其它小組可以立即進行下一個環節的比賽。
當然,最後一名小組,有權利繼續完成比賽。
修改第二小節的程式碼,在 Main 內第一行加上 barrier.RemoveParticipant();
。
static void Main(string[] args) { barrier.RemoveParticipant(); ... ...
試著再執行一下。
SignalAndWait()
的 過載比較多,例如 SignalAndWait(CancellationToken)
,這裡筆者先不講解此方法如何使用。等到寫到後面的非同步(Task
),讀者學到相關的知識點,我們再過一次複習,這樣由易到難,自然水到渠成。
Barrier 適合用於同時執行相同流程的工作,因為工作內容是相同的,便於協同。工作流有可能用得上吧。
但是 Barrier 更加適合用於演演算法領域,可以參考:https://devblogs.microsoft.com/pfxteam/parallel-merge-sort-using-barrier/
到此這篇關於C#多執行緒系列之多階段並行執行緒的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45