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个任务在每个阶段的完成顺序不太一样,所有任务完成后才进入下一个阶段。

参考:

Barrier的微软官网介绍

Barrier类的构成

本文有不妥之处,请见谅。

.NET同步原语Barrier简介的更多相关文章

  1. C#并行编程-线程同步原语

    菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ...

  2. 从同步原语看非阻塞同步以及Java中的应用

    非阻塞同步:基于冲突检测的乐观并发策略,通俗讲就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了,如果争用数据有冲突那就采用其他的补偿措施(最常见的就是不断重试直到成功),这种乐观的并发策略 ...

  3. python多线程编程—同步原语入门(锁Lock、信号量(Bounded)Semaphore)

    摘录python核心编程 一般的,多线程代码中,总有一些特定的函数或者代码块不希望(或不应该)被多个线程同时执行(比如两个线程运行的顺序发生变化,就可能造成代码的执行轨迹或者行为不相同,或者产生不一致 ...

  4. ACE框架 同步原语设计

    ACE框架常用的同步机制设计成统一的原语接口.同步原语使用系统平台(操作系统,多线程库)提供的同步原语,并为系统平台不提供的同步原语提供模拟实现.ACE框架使用了外观模式和适配器分两层,将同步原语统一 ...

  5. java 轻量级同步volatile关键字简介与可见性有序性与synchronized区别 多线程中篇(十二)

    概念 JMM规范解决了线程安全的问题,主要三个方面:原子性.可见性.有序性,借助于synchronized关键字体现,可以有效地保障线程安全(前提是你正确运用) 之前说过,这三个特性并不一定需要全部同 ...

  6. python线程同步原语--源码阅读

    前面两篇文章,写了python线程同步原语的基本应用.下面这篇文章主要是通过阅读源码来了解这几个类的内部原理和是怎么协同一起工作来实现python多线程的. 相关文章链接:python同步原语--线程 ...

  7. python--线程同步原语

    Threading模块是python3里面的多线程模块,模块内集成了许多的类,其中包括Thread,Condition,Event,Lock,Rlock,Semaphore,Timer等等.下面这篇文 ...

  8. python同步原语--线程锁

    多线程锁是python多种同步原语中的其中一种.首先解析一下什么是同步原语,python因为GIL(全局解析锁)的缘故,并没有真正的多线性.另外python的多线程存在一个问题,在多线程编程时,会出现 ...

  9. Memory barrier 简介

    Memory barrier Memory barrier 简介 程序在运行时内存实际的访问顺序和程序代码编写的访问顺序不一定一致,这就是内存乱序访问.内存乱序访问行为出现的理由是为了提升程序运行时的 ...

随机推荐

  1. 怎么回答面试官:你对Spring的理解?

    最近看了点Spring的源码,正好来稍微扯一扯,帮一部分培训班的朋友撕开一道口子,透透气.我自己都是看的培训班视频,所以也算培训班出身吧.所以下文开口闭口"培训班",不要觉得是我在 ...

  2. 解决java socket在传输汉字时出现截断导致乱码的问题

    解决java socket在传输汉字时出现截断导致乱码的问题 当使用socket进行TCP数据传输时,传输的字符串会编码成字节数组,当采用utf8编码时,数字与字母长度为1个字节,而汉字一般为3个字节 ...

  3. hdu1233 最小生成树Prim算法和Kruskal算法

    Prim算法 时间复杂度:O(\(N^2\),N为结点数) 说明:先任意找一个点标记,然后每次找一条最短的两端分别为标记和未标记的边加进来,再把未标记的点标记上.即每次加入一条合法的最短的边,每次扩展 ...

  4. jquery循环动画

      <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title&g ...

  5. jquery动画(控制动画隐藏、显示时间轴)

    <!DOCTYPE html><html> <head>    <meta http-equiv="Content-type" conte ...

  6. excel函数sum、sumif和sumifs

    1.sum(a1,a2,a2,...a10)或sum(a1:a10)求a1到a10的和 2.sumif(条件区域,指定的求和条件,求和的区域) =SUMIF($F$2:$F$7,J2,$H$2:$H$ ...

  7. 12、Linux磁盘设备基础知识(1)

    GB TB PB EP ZB YB BB:

  8. win10 共享文件夹设置无需用户名密码访问

    文件夹设置共享,添加Everyone 文件夹右键属性,选择共享,添加Everyone,添加后可设置读写权限. 权限添加Everyone,不然没有权限访问 设置安全策略 Win+R 打开运行,输入 se ...

  9. 架构之:serverless架构

    目录 简介 什么是serverless serverless的例子 简单的三层服务 消息驱动 FaaS FaaS的缺点 FaaS的优点 总结 简介 不知道什么时候,出现了一个叫做Serverless架 ...

  10. JSR - 133 都解决了哪些问题?

    究竟什么是内存模型? 在多处理系统中,每个 CPU 通常都包含一层或者多层内存缓存,这样设计的原因是为了加快数据访问速度(因为数据会更靠近处理器) 并且能够减少共享内存总线上的流量(因为可以满足许多内 ...