.NET同步原语Barrier简介
Barrier(屏障)是一种自定义的同步原语(synchronization primitive),它解决了多个线程(参与者)在多个阶段之间的并发和协调问题。
1)多个参与者执行相同的几个阶段的操作
2)在每一个阶段内,多个参与者并发执行
3)一个屏障点代表一个阶段的结束
4)一个参与者运行至屏障点时被阻塞,需要等待其他参与者都到达屏障点
5)所有参与者都到达了屏障点,才可以进入下一个阶段
创建Barrier时,需要指定参与者数量。它允许动态的添加或者删除参与者。
Barrier适合多个线程执行多个阶段的操作。如果只有一个或两个阶段,可以考虑ContinueWhenAll。
下面是一个简单的例子。4个线程执行执行4个阶段。

四个阶段的代码。(每个阶段只是输出文本,表示某个阶段的某个任务结束)
private static void RunPhase1(int taskId)
{
Console.WriteLine("phase 1, task {0} completed", taskId);
}
private static void RunPhase2(int taskId)
{
Console.WriteLine("phase 2, task {0} completed", taskId);
}
private static void RunPhase3(int taskId)
{
Console.WriteLine("phase 3, task {0} completed", taskId);
}
private static void RunPhase4(int taskId)
{
Console.WriteLine("phase 4, task {0} completed", taskId);
}
Barrier代码。(定义参与者数量,以及到达屏障点所做的事情,即输出文本宝石当前阶段结束)
private static Barrier barrier = new Barrier(4, (b) =>
{
Console.WriteLine("phase {0} completed", b.CurrentPhaseNumber);
Console.WriteLine();
});
Main方法代码。(创建4个任务,执行四个阶段,每个阶段结束时调用SignalAndWait方法设立屏障点)
static void Main(string[] args)
{
var tasks = new List<Task>();
for (var i = 0; i < 4; i++)
{
tasks.Add(Task.Factory.StartNew((index) =>
{
var taskId = (int)index; RunPhase1(taskId);
barrier.SignalAndWait(); RunPhase2(taskId);
barrier.SignalAndWait(); RunPhase3(taskId);
barrier.SignalAndWait(); RunPhase4(taskId);
barrier.SignalAndWait(); }, i));
} var finalTask = Task.Factory.ContinueWhenAll(tasks.ToArray(), (taskList) =>
{
Task.WaitAll(taskList);
Console.WriteLine("all phases completed");
barrier.Dispose();
});
finalTask.Wait(); Console.ReadLine();
}
运行代码,查看结果。您会发现4个任务在每个阶段的完成顺序不太一样,所有任务完成后才进入下一个阶段。

参考:
本文有不妥之处,请见谅。
.NET同步原语Barrier简介的更多相关文章
- C#并行编程-线程同步原语
菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ...
- 从同步原语看非阻塞同步以及Java中的应用
非阻塞同步:基于冲突检测的乐观并发策略,通俗讲就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了,如果争用数据有冲突那就采用其他的补偿措施(最常见的就是不断重试直到成功),这种乐观的并发策略 ...
- python多线程编程—同步原语入门(锁Lock、信号量(Bounded)Semaphore)
摘录python核心编程 一般的,多线程代码中,总有一些特定的函数或者代码块不希望(或不应该)被多个线程同时执行(比如两个线程运行的顺序发生变化,就可能造成代码的执行轨迹或者行为不相同,或者产生不一致 ...
- ACE框架 同步原语设计
ACE框架常用的同步机制设计成统一的原语接口.同步原语使用系统平台(操作系统,多线程库)提供的同步原语,并为系统平台不提供的同步原语提供模拟实现.ACE框架使用了外观模式和适配器分两层,将同步原语统一 ...
- java 轻量级同步volatile关键字简介与可见性有序性与synchronized区别 多线程中篇(十二)
概念 JMM规范解决了线程安全的问题,主要三个方面:原子性.可见性.有序性,借助于synchronized关键字体现,可以有效地保障线程安全(前提是你正确运用) 之前说过,这三个特性并不一定需要全部同 ...
- python线程同步原语--源码阅读
前面两篇文章,写了python线程同步原语的基本应用.下面这篇文章主要是通过阅读源码来了解这几个类的内部原理和是怎么协同一起工作来实现python多线程的. 相关文章链接:python同步原语--线程 ...
- python--线程同步原语
Threading模块是python3里面的多线程模块,模块内集成了许多的类,其中包括Thread,Condition,Event,Lock,Rlock,Semaphore,Timer等等.下面这篇文 ...
- python同步原语--线程锁
多线程锁是python多种同步原语中的其中一种.首先解析一下什么是同步原语,python因为GIL(全局解析锁)的缘故,并没有真正的多线性.另外python的多线程存在一个问题,在多线程编程时,会出现 ...
- Memory barrier 简介
Memory barrier Memory barrier 简介 程序在运行时内存实际的访问顺序和程序代码编写的访问顺序不一定一致,这就是内存乱序访问.内存乱序访问行为出现的理由是为了提升程序运行时的 ...
随机推荐
- JavaScript 中的 Var,Let 和 Const 有什么区别
一.var 在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量,也是顶层变量 注意:顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象 var ...
- 支持向量机(SVM)之硬阈值
支持向量机 ( support vector machine, SVM ) 是使用超平面来对给定的 p 维向量进行分类的非概率二元线性分类器. 一.超平面 ( hyperplane ) 在一个p维的输 ...
- JavaScript的核心语法
1.JavaScript同其他程序设计语言一样,有着独特的语法结构,主要包含:变量.数据类型.运算符号.控制语句和注释等. 2.变量是存储数据的基本单位,JavaScript通常利用变量来参与j各种运 ...
- MySQL 到 ES 数据实时同步技术架构
MySQL 到 ES 数据实时同步技术架构 我们已经讨论了数据去规范化的几种实现方式.MySQL 到 ES 数据同步本质上是数据去规范化多种实现方式中的一种,即通过"数据迁移同步" ...
- 从ReentrantLock看AQS (AbstractQueuedSynchronizer) 运行流程
从ReentrantLock看AQS (AbstractQueuedSynchronizer) 运行流程 概述 本文将以ReentrantLock为例来讲解AbstractQueuedSynchron ...
- NuGet微软官方中国镜像地址
https://nuget.cdn.azure.cn/v3/index.json
- 3、mysql的多实例配置(2)
4.设置mysql多实例启动脚本: (1)3306: [root@backup application]# cat /data/3306/mysql #!/bin/sh . /etc/init.d/f ...
- JS刷新窗口的几种方式
浮层内嵌iframe及frame集合窗口,刷新父页面的多种方法 <script language=JavaScript> parent.location.reload(); ...
- Gym 100008E Harmonious Matrices 高斯消元
POJ 1222 高斯消元更稳 看这个就懂了 #include <bits/stdc++.h> using namespace std; const int maxn = 2000; in ...
- Python迭代器和生成器你学会了吗?
在了解什么是迭代器和生成器之前,我们先来了解一下容器的概念.对于一切皆对象来说,容器就是对象的集合.例如列表.元祖.字典等等都是容器.对于容器,你可以很直观地想象成多个元素在一起的单元:而不同容器的区 ...