[.net 多线程]Barrier
当需要【一组任务】并行地运行一连串的阶段,但是每一个阶段都要等待所有他任务完成前一阶段之后才能开始,可以通过Barrier实例来同步这一类协同工作。
Barrier初始化后,将等待特定数量的信号到来,这个数量在Barrier初始化时指定,在所指定的信号个数已经到来后,Barrier将执行一个指定的动作,这个动作也是在Barrier初始化时指定。Barrier在执行动作过后,将会重置,这时又将等待特定数量的信号到来,再执行指定动作。信号通过成员函数SignalAndWait()来发送,执行SignalAndWait()函数的Task或者线程将会投入等待,Barrier将等待特定数量的信号到达,然后Barrier执行完指定动作后被重置,这时SignalAndWait()函数所在的Task或者线程将继续运行。在程序的运行过程中,可以通过成员函数AddParticipant()和RemoveParticpant()来增加或者减少需要等待的信号数量
public static void Phase1(int taskId)
{
Console.WriteLine($"Task[{taskId}] complete phase1");
}
public static void Phase2(int taskId)
{
Console.WriteLine($"Task[{taskId}] complete phase2");
}
public static void Phase3(int taskId)
{
Console.WriteLine($"Task[{taskId}] complete phase3");
}
public static void Phase4(int taskId)
{
Console.WriteLine($"Task[{taskId}] complete phase4");
}
static void Main(string[] args)
{
Barrier barrier = new Barrier();
int taskId = ;
for (int i = ; i < ; i++)
{
Task.Factory.StartNew(() =>
{
int cur = Interlocked.Increment(ref taskId);
Phase1(cur);
barrier.SignalAndWait();
Phase2(cur);
barrier.SignalAndWait();
Phase3(cur);
barrier.SignalAndWait();
Phase4(cur);
barrier.SignalAndWait();
});
}
Console.ReadKey();
}
Barrier示例
任务执行流程如下:
执行结果:
Task1/Task2/Task3在phase1都执行完后,才会接着执行phase2
Barrier代码实现分析:https://www.cnblogs.com/majiang/p/7898027.html
[.net 多线程]Barrier的更多相关文章
- 刀哥多线程Barrier异步gcd-08-barrier_async
Barrier 异步 主要用于在多个异步操作完成之后,统一对非线程安全的对象进行更新 适合于大规模的 I/O 操作 代码演练 准备工作 @interface ViewController () { / ...
- Python多线程-Barrier(障碍对象)
Barrier(parties, action=None, timeout=None) 每个线程通过调用wait()尝试通过障碍,并阻塞,直到阻塞的数量达到parties时,阻塞的线程被同时全部释放. ...
- [Python 多线程] Barrier (十一)
Barrier 栅栏,也叫屏障.可以想象成路障.道闸. Python 3.2引入的新功能. 构造方法: threading.Barrier(parties, action=None, timeout= ...
- python线程障碍对象Barrier(34)
python线程Barrier俗称障碍对象,也称栅栏,也叫屏障. 一.线程障碍对象Barrier简介 # 导入线程模块 import threading # 障碍对象barrier barrier = ...
- 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent
[源码下载] 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEve ...
- [转载] java多线程学习-java.util.concurrent详解(一) Latch/Barrier
转载自http://janeky.iteye.com/blog/769965 Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent, 提供了大量高级工具,可 ...
- 《C#多线程编程实战》2.8 Barrier
不得不说,C#的同步线程的机制是真的多. 各式各样.几乎各种场景下都有可以使用的同步机制. 今天说的,就是比较有意思了. 等待的机制很简单,单纯的等待. 使用的方法我就等. 等待的东西或者内容则是你自 ...
- QNX多线程同步之Barrier(屏障)
之前和大家介绍过QNX上的线程同步方法metux和semophore,通过这两种方法可以对一个或者几个资源进行加锁,避免资源使用上的冲突.在另一种情况下,某个线程需要在其它线程完成工作后才继续执行,这 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
随机推荐
- PHP 获取指定日期的星期几的方法
<?php header("Content-type: text/html; charset=utf-8"); //获取星期方法 function get_week($dat ...
- zabbix设置sendmail发送邮件
http://blog.csdn.net/xin_yu_xin/article/details/45115723
- 代码说明call和apply方法的区别 (咱们这方面讲解的少,这样的题有变式,需要举例讲解一下)
这两个都是函数的方法,可以改变this的指向,fn.call(obj,param1,param2,…) call传入单个参数 fn.apply(obj,[param1,param2,...]) app ...
- http://www.jb51.net/list/list_233_2.htm(导航: 首页 >> 软件编程 >> Android)
日期:2015-04-24理解Android中Activity的方法回调 日期:2015-04-24Android获取手机通讯录.sim卡联系人及调用拨号界面方法 日期:2015-04-24And ...
- leetcode773
使用两种语言实现,先贴C++的 class Solution { public: vector<vector<int>> floodFill(vector<vector& ...
- java 调用webservice (asmx) 客户端开发示例
这是本人第一次写博客,其实就是自己做个笔记,写的很粗糙,也希望能给跟我遇到同样问题的你一点帮助. 因为最近有个项目要调用webservice接口,之前接触的都是Java开发服务端和客户端的接口,开发前 ...
- 【总结整理】原创概念原创idea---摘自《结网》
假如你有一个原创想法,搜索引擎是否已有现成产品与自己的想法一致,如果有,研究他可以节省很多摸索的时间:若没有,那就是一个货真价实的原创idea: 第一类:受到现有产品的启发,将既有概念进行了转换. 第 ...
- 基于Nginx简单实现动静分离
1.首先安装Nginx 2.在Nginx.conf文件中添加如下配置: server{ listen 80; server_name www.lf.com; location ~ (.jpg|.png ...
- spring框架 事务 注解配置方式
user=LF password=LF jdbcUrl=jdbc:oracle:thin:@localhost:1521:orcl driverClass=oracle.jdbc.driver.Ora ...
- Mybatis中resultType和resultMap
一.概述MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部Res ...