C# Barrier类

212954bacc0d9ba3c4d541ff32d026ff.png

对于同步,Barrier 类非常适用于其中工作有多个任务分支且以后又需要合并工作的情况。Barrier 类用于需要同步的参与者。激活一个任务时,就可以动态地添加其他参与者,例如,从父任务中创建子任务。参与者在继续之前,可以等待所有其他参与者完成其工作。

c17904af174185b0c2c2624a592645b1.png

BarrierSample 有点复杂,但它展示了 Barrier 类型的功能。下面的应用程序使用一个包含 2 000 000 个随机字符串的集合。使用多个任务遍历该集合,并统计以 a、b、c 等开头的字符串个数。工作不仅分布在不同的任务之间,也放在一个任务中。毕竟所有的任务都迭代字符串的第一个集合,汇总结果,以后任务会继续处理下一个集合。

89ebe8328069b4e4b76322470472c184.png

FillData() 方法创建一个集合,并用随机字符串填充它:

public static IEnumerable<string> FillData(int size)
{var r = new Random();return Enumerable.Range(0, size).Select(x => GetString(r));
}private static string GetString(Random r)
{var sb = new StringBuilder(6); for (int i = o; i < 6; i++){sb.Append((char)(r.Next(26) + 97));}return sb.ToString();
}

e67e90ae7cff14266ab80ad875a3a3d6.png

在 LogBarrierInformation 方法中定义一个辅助方法,来显示 Barrier 的信息:

private static void LogBarrierInformation(string info, Barrier barrier) 
{Console.WriteLine($"Task {Task.CurrentId): {info)."+$"{barrier.ParticipantCount} current and " +$"{barrier.ParticipantsRemaining} remaining participants, " +$"phase {barrier.CurrentPhaseNumber}") ;
}

8aee92bdbc340dd58286db8e854a0225.png

CalculationInTask() 方法定义了任务执行的作业。通过参数,第 3 个参数引用 Barrier 实例。用于计算的数是数组 IList<string>。最后一个参数是 int 锯齿数组,用于在任务执行过程中写出结果。

acdbc799bd1ab8132f11d44526aef213.png

任务把处理放在一个循环中。每一次循环中,都处理 IList<string>[] 的数组元素。每个循环完成后,任务通过调用 SignalAndWait 方法,发出做好了准备的信号,并等待,直到所有的其他任务也准备好处理为止。这个循环会继续执行,直到任务完全完成为止。接着,任务就会使用 RemoveParticipant() 方法从 Barrier 类中删除它自己:

private static void CalculationInTask(int jobNumber, int partitionSize,Barrier barrier, IList<string>[] coll, int loops, int[][] results)
{LogBarrierInformation("CalculationInTask started", barrier);for (int i = 0; i < loops; i++){var data = new List<string>(coll[i]);int start = jobNumber * partitionSize; int end = start + partitionSize;Console.WriteLine($"Task {Task.CurrentId) in loop {i}: partition " +$"from {start} to {end}");for (int j = start; j < end; j++){char c = data[j] [0]; results[i][c - 97]++;}Console.WriteLine($"Calculation completed from task {Task.CurrentId) " +$"in loop {i}. {results[i][0]} times a, {results[i][25]} times z"); LogBarrierInformation("sending signal and wait for all", barrier);barrier.SignalAndWait();LogBarrierInformation("waiting completed", barrier);}barrier.RemoveParticipant();LogBarrierInformation("finished task, removed participant", barrier);
}

a1d8c073f601d5ad9bb1088455e0f807.png

在 Main() 方法中创建一个 Barrier 实例。在构造函数中,可以指定参与者的数量。在该示例中,这个数量是 3(numberTasks + 1),因为该示例创建了两个任务,Main() 方法本身也是一个参与者。使用 Task.Run 创建两个任务,把遍历集合的任务分为两个部分。启动该任务后,使用 SignalAndWait() 方法,Main() 方法在完成时发出信号,并等待所有其他参与者或者发出完成的信号,或者从Barrier 类中删除它们。一旦所有的参与者都准备好,就提取任务的结果,并使用Zip() 扩展方法把它们合并起来。接着进行下一次迭代,等待任务的下一个结果:

static void Main()
{const int numberTasks = 2;const int partitionSize = 1000000; const int loops = 5;var taskResults = new Dictionary<int, int[][]>(); var data = new List<string>[loops]; for (int i = o; i < loops; i++){data[i] = new List<string>(FillData(partitionSize * numberTasks);}var barrier = new Barrier(numberTasks + 1);LogBarrierInformation("initial participants in barrier", barrier); for (int i = 0; i < numberTasks; i++){barrier.AddParticipant(); int jobNumber = i;taskResults.Add(i, new int[loops][]);for (int loop = 0; loop < loops; loop++){taskResult[i, loop] = new int[26];}Console.WriteLine("Main - starting task job {jobNumber}");Task.Run(() => CalculationInTask(jobNumber, partitionSize, barrier, data, loops, taskResults[jobNumber]));}for (int loop = 0; loop < 5; loop++){LogBarrierInformation("main task, start signaling and wait", barrier); barrier.SignalAndWait();LogBarrierInformation("main task waiting completed", barrier); int[][] resultCollection1 = taskResults[0]; int[][] resultCollection2 = taskResults[1];var resultCollection = resultCollection1[loop].Zip(resultCollection2[loop],(cl, c2) => cl + c2); char ch = 'a'; int sum = 0;foreach (var x in resultCollection){Console.WriteLine($"{ch++}, count: {x}"); sum += x;}LogBarrierInformation($"main task finished loop {loop}, sum: {sum}", barrier);}Console.WriteLine("finished all iterations"); Console.ReadLine();
}

d2a5ef1088bd681eeb61a9b59268b4a6.png

运行应用程序,输出如下所示。在输出中可以看到,每个 AddParticipant 调用都会增加参与者的数量和剩下的参与者数量。只要一个参与者调用 SignalAndWait,剩下的参与者数就会递减。当剩下的参与者数量达到0时,所有参与者的等待就结束,开始下一个阶段:

Task : initial participants in barrier. 1 current and 1 remaining participants, phase 0.

Main - starting task job 0

Main - starting task job 1

Task : main task, starting signaling and wait. 3 current and

3 remaining participants, phase 0.

Task 4: CalculationInTask started. 3 current and 2 remaining participants, phase 0.

Task 5: CalculationInTask started. 3 current and 2 remaining participants, phase 0.

Task 4 in loop 0: partition from 0 to 1000000

Task 5 in loop 0: partition from 1000000 to 2000000

Calculation completed from task 4 in loop 0. 38272 times a, 38637 times z Task 4: sending signal and wait for all. 3 current and

2 remaining participants,  phase 0.

Calculation completed from task 5 in loop 0. 38486 times a, 38781 times z. Task 5: sending signal and wait for all. 3 current and

1 remaining participants,  phase 0.

Task 5: waiting completed. 3 current and 3 remaining participants, phase 1 Task 4:   waiting completed. 3 current and 3 remaining participants, phase 1

Task : main waiting completed. 3 current and 3 remaining participants, phase 1

42efe4883ad79b1aa48df64a7ed0d0d0.png

85b23d7265019e0b6fee3e479021b418.png

 微信公众号 

Dotnet讲堂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

特斯拉宣布将在欧洲建设第二座超级工厂

北京时间11月9日早间消息&#xff0c;特斯拉CEO伊隆马斯克&#xff08;Elon Musk&#xff09;和首席技术官JB斯特罗贝尔&#xff08;JB Straubel&#xff09;本周在德国宣布了对德国工程集团Grohmann Engineering的收购。在随后的发布会上&#xff0c;马斯克强调&#xff0c;特…

IOS学习笔记十三(使用类别实现非正式协议)

1、协议 可以理解为java里面的接口 2、测试Demo NSObjectchenyu.h #ifndef NSObject_chenyu_h #define NSObject_chenyu_h #import <Foundation/Foundation.h>interface NSObject(chenyu) -(void)test; end#endif /* NSObject_chenyu_h */ Org.h #ifndef Org_h#defin…

c语言程序设计的顺序结构的常用控制语句,C语言程序设计教程-第03课-顺序结构的程序设计.ppt...

《C语言程序设计教程-第03课-顺序结构的程序设计.ppt》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《C语言程序设计教程-第03课-顺序结构的程序设计.ppt(21页珍藏版)》请在人人文库网上搜索。1、第3章 顺序结构的程序设计,3.1 顺序结构问题的提出 3.2 赋 值 语 句 3…

Android版哆啦A梦连连看游戏源码完整版

本代码主本人编写&#xff0c;没版权问题&#xff0c;另有其他少量小游戏和应用源码稍后会陆续上线!哆啦A梦连连看包括了2种游戏模式和60关卡&#xff0c;并可以通过修改配置文件很方便的实现自行增加新关卡。采用andengine游戏引擎开发&#xff0c;内置了趣米广告和用户统计fl…

javascript 高级程序设计_重读《JavaScript高级程序设计》

最近自己在休假&#xff0c;打算闭门几天将《JavaScript高级程序设计》(第3版)这本良心教材再回顾一遍。目前自己进入前端领域两年多&#xff0c;现在重读并记录下这本教材的“硬”知识点 。本文原文链接请戳 重读《JavaScript高级程序设计》​link.jianshu.com函数没有重载ECM…

[异常解决] ubuntu上安采用sudo启动的firefox,ibus输入法失效问题解决

采用sudo启动的应用是root权限的应用&#xff0c; ibus失效是因为ibus的初始配置采用user权限: 而root下运行的firefox输入法的配置还是停留在默认情况~ 解决方案是在shell下以root权限运行ibus&#xff0c;然后进行配置&#xff1a; 1、shell下输入&#xff1a;sudo ibus-setu…

Avalonia-.NET 的跨平台 UI 框架

简介Avalonia 是 dotnet 的跨平台 UI 框架&#xff0c;提供灵活的样式系统并支持 Windows、Linux、macOS 等多种操作系统。Avalonia 已经成熟并且可以投入生产。我们还在测试版中支持 iOS、Android&#xff0c;并在早期阶段通过 WASM 支持浏览器。使用在WPF中&#xff0c;当你在…

fun的用法c语言,fun的用法_fun的用法

fun有乐趣;玩笑等意思&#xff0c;那么你知道fun的用法吗?下面跟着货呼呼网阿呼一起来学习一下&#xff0c;希望对大家的学习有所帮助!fun的用法大全&#xff1a;fun的用法1&#xff1a;fun是不可数名词,没有复数形式,也不可加不定冠词,其后可接(in) v -ing。fun的用法2&#…

Skype for TV停止支持 三星确认今年6月移除该应用

微软热门视频聊天和语音通话服务Skype自今天开始将不再支持智能电视。用户无法在智能电视上登录或者重置密码。在停止支持之后&#xff0c;由电视制造厂商自行决定移除Skype应用或者继续提供非支持版本。三星已经确认将于2016年6月2日开始在旗下的智能电视中移除Skype服务&…

CactiEZ V10.1 中文版 Cacti中文解决方案+使用教程(2)

配置被监控的Windows主机说明&#xff1a;要使用CactiEZ监控一台Windows主机&#xff0c;需要在被监控的主机上面安装snmp&#xff08;简单网络管理协议&#xff09;1、下面开始安装配置snmp开始-设置-控制面板-添加或删除程序-添加删除Windows组件找到管理和监视工具&#xff…

IOS之学习笔记十四(协议的定义和实现)

1、正式协议的定义 protocol 协议名 <父协议1, 父协议2>{零个到多个方法定义} 一个协议可以有多个直接父协议&#xff0c;但协议只能继承协议&#xff0c;不能继承类 协议只有方法签名&#xff0c;没有方法实现 2、实现协议 interface 类名 : 父类 <协议1&#xff0…

【SPSS统计分析】运用spss软件进行问卷信度分析(附SPSS19.0简体中文版下载地址)

目 录 一、概念 二、信度指标 三、信度分析方法 四、利用SPSS进行信度分析 一、概念 信度是指根据测验工具所得到的结果的一致性或稳定性,反映被测特征真实程度的指标。一般而言,两次或两个测验的结果愈是一致,则误差愈小,所得的信度愈高,它具有以下特性: 1. 信度…

AgileConfig 1.6.0 发布 - 支持服务注册与发现

大家好&#xff0c;好久没有输出博文了&#xff0c;一是因为比较忙&#xff0c;另外一个原因是最近主要的精力是在给 AgileConfig 添加一个新的功能&#xff1a;服务注册与发现。先说说为什么会添加这个功能。我自己的项目是用 Consul 来做为服务注册发现组件的。自从我上线了 …

快速排序算法_Python实现快速排序算法

排序是算法的入门知识&#xff0c;应用广泛&#xff0c;且在程序员面试中&#xff0c;经常被提及&#xff0c;其中最常考的两大排序算法为快速排序与归并排序&#xff0c;本篇将使用Python语言来分析了解快速排序算法。思想 快速排序是一种非常高效的排序算法&#xff0c;采用 …

用户反馈KB3189866累积更新出现卡在95%进度情况

伴随着本月的补丁星期二活动&#xff0c;微软面向Windows 10推出了三款累积更新。和以往相同&#xff0c;部分用户反馈称无法安装本次更新并导致出现各种问题。很多读者反馈称KB3189866累积更新会在45%或95%的时候卡住不动&#xff0c;无法执行和完成安装。 在尝试过几种临时解…

UVa1607 poj1435 UVaLive1686 Gates

填坑系列(p.246) 由函数连续性得满足二分性 1 #include<cstdio>2 #include<cstring>3 #include<cstdlib>4 #include<algorithm>5 #include<iostream>6 7 using namespace std;8 9 void setIO(const string& s) { 10 freopen((s ".…

c语言入门数组,C语言入门之数组(2)

二维数组前面介绍的数组只有一个下标&#xff0c;称为一维数组&#xff0c; 其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的&#xff0c; 因此C语言允许构造多维数组。多维数组元素有多个下标&#xff0c; 以标识它在数组中的位置&#xff0c;所以也称为多…

IOS开发--TextField

2019独角兽企业重金招聘Python工程师标准>>> //初始化text field的位置和大小UITextField *text [[UITextField alloc] initWithFrame:CGRectMake(20, 20, 130, 130)];//设置边框样式//样式有很多种&#xff0c;点进去查看text.borderStyle UITextBorderStyleRoun…

IOS之学习笔记十五(协议和委托的使用)

1、协议和委托的使用 1)、协议可以看下我的这篇博客 IOS之学习笔记十四(协议的定义和实现) https://blog.csdn.net/u011068702/article/details/80963731 2)、委托可以叫代理&#xff0c;实现协议的类的对象可以叫委托对象或者代理对象 3)、关键就是我们在控制器里类(获取数…