C#多阶段并行线程师实例分析
这篇“C#多阶段并行线程师实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#多阶段并行线程师实例分析”文章吧。
前言应用场景主要是控制 N 个线程(可随时增加或减少执行的线程),使得多线程在能够在 M 个阶段中保持同步。
线程工作情况如下:
我们接下来 将学习C# 中的 Barrier ,用于实现并行协同工作。
Barrier 类使多个任务能够采用并行方式依据某种算法在多个阶段中协同工作,使多个线程(称为“参与者” )分阶段同时处理算法。
可以使多个线程(称为“参与者” )分阶段同时处理算法。(注意算法这个词)
每个参与者完成阶段任务后后将被阻止继续执行,直至所有参与者都已达到同一阶段。
Barrier 的构造函数如下:
其中一个构造函数定义如下:
publicBarrier(intparticipantCount,Action<Barrier>postPhaseAction);
participantCount :处于的线程数量,大于0并且小于32767。
postPhaseAction :在每个阶段后执行 Action(委托)。
属性和方法在还没有清楚这个类有什么作用前,我们来看一下这个类的常用属性和方法。
大概了解 Barrier 有哪些常用属性和方法后,我们开始编写示例代码。
属性:
方法:
Barrier 翻译屏障,前面所说的 “阶段”,在文档中称为屏障,官方有一些例子和实践场景:
https://docs.microsoft.com/zh-cn/dotnet/standard/threading/barrier?view=netcore-3.1
https://docs.microsoft.com/zh-cn/dotnet/standard/threading/how-to-synchronize-concurrent-operations-with-a-barrier?view=netcore-3.1
本文的教程比较简单,你可以先看本教程,再去看看官方示例。
示例假设有个比赛,一个有三个环节,有三个小组参加比赛。
比赛有三个环节,小组完成一个环节后,可以去等待区休息,等待其他小组也完成比赛后,开始进行下一个环节的比赛。
示例如下:
new Barrier(int,Action)
设置有多少线程参与,Action 委托设置每个阶段完成后执行哪些动作。
.SignalAndWait()
阻止当前线程继续往下执行;直到其他完成也执行到此为止。
classProgram{//Barrier(Int32,Action)privatestaticBarrierbarrier=newBarrier(3,b=>Console.WriteLine($"\n第{b.CurrentPhaseNumber+1}环节的比赛结束,请评分!"));staticvoidMain(string[]args){//Random模拟每个小组完成一个环节比赛需要的时间Threadthread1=newThread(()=>DoWork("第一小组",newRandom().Next(2,10)));Threadthread2=newThread(()=>DoWork("第二小组",newRandom().Next(2,10)));Threadthread3=newThread(()=>DoWork("第三小组",newRandom().Next(2,10)));//三个小组开始比赛thread1.Start();thread2.Start();thread3.Start();Console.ReadKey();}staticvoidDoWork(stringname,intseconds){//第一环节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();
。
staticvoidMain(string[]args){barrier.RemoveParticipant();......
试着再运行一下。
说明SignalAndWait()
的 重载比较多,例如SignalAndWait(CancellationToken)
,这里笔者先不讲解此方法如何使用。等到写到后面的异步(Task
),读者学到相关的知识点,我们再过一次复习,这样由易到难,自然水到渠成。
Barrier 适合用于同时执行相同流程的工作,因为工作内容是相同的,便于协同。工作流有可能用得上吧。
以上就是关于“C#多阶段并行线程师实例分析”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。