Barrier 组织多个线程及时在某个时刻碰面
任意一个线程调用了 _barrier.SignalAndWait() 方法后,会执行一个回调函数来打印出阶段。
/// <summary>
/// 实例 Barrier 类
/// </summary>
public static Barrier _barrier = new Barrier(, b => Console.WriteLine($"第 {b.CurrentPhaseNumber + 1} 阶段结束")); /// <summary>
/// 向 Barrier 发送信号
/// </summary>
/// <param name="name"></param>
/// <param name="message"></param>
/// <param name="seconds"></param>
public static void PlayMusic(string name, string message, int seconds)
{
for (int i = ; i < ; i++)
{
Console.WriteLine("------------------------"); System.Threading.Thread.Sleep(TimeSpan.FromSeconds(seconds));
Console.WriteLine($"{name} 开始 {message}"); System.Threading.Thread.Sleep(TimeSpan.FromSeconds(seconds));
Console.WriteLine($"{name} 结束 {message}"); // 回调函数 打印出阶段
_barrier.SignalAndWait();
}
}
每个线程将向 Barrier 发送两次信号,所以会有两个阶段,可以在每个迭代结束前执行一些计算。当最后一个线程调用 SignalAndWait方法时可以在迭代结束时进行交互。
/// <summary>
/// 执行
/// </summary>
public static void Implement()
{
var t1 = new System.Threading.Thread(() => PlayMusic("吉他手", "奏曲", )); var t2 = new System.Threading.Thread(() => PlayMusic("歌手", "唱他的歌", )); t1.Start();
t2.Start();
}
输出结果:

Barrier 组织多个线程及时在某个时刻碰面的更多相关文章
- C# 线程同步
Mutex 类 使用Mutex类来同步两个单独的程序.Mutex是一种原始的同步方式,其只对一个线程授予对共享资源的独占访问. const string NutexName = "C&quo ...
- C#当中的多线程_线程同步
第2章 线程同步 原来以为线程同步就是lock,monitor等呢,看了第二章真是大开眼界啊! 第一章中我们遇到了一个叫做竞争条件的问题.引起的原因是没有进行正确的线程同步.当一个线程在执行操作时候, ...
- c#多线程总结(纯干货)
线程基础 创建线程 static void Main(string[] args) { Thread t = new Thread(PrintNumbers); t.Start();//线程开始执行 ...
- c#多线程编程实战(原书第二版)文摘
Thread t = new Thread(PrintNumbersWithDelay); t.Start(); t.Join(); 但我们在主程序中调用了t.Join方法,该方法允许我们等待直到线程 ...
- 线程同步-Barrier类
Barrier类:用于组织多个线程及时在某一个时刻碰面.并提供了一个回调函数,每次线程调用了SignalAndWait方法后该回调函数会被执行. 代码Demo: using System;using ...
- python线程障碍对象Barrier(34)
python线程Barrier俗称障碍对象,也称栅栏,也叫屏障. 一.线程障碍对象Barrier简介 # 导入线程模块 import threading # 障碍对象barrier barrier = ...
- Disruptor——一种可替代有界队列完成并发线程间数据交换的高性能解决方案
本文翻译自LMAX关于Disruptor的论文,同时加上一些自己的理解和标注.Disruptor是一个高效的线程间交换数据的基础组件,它使用栅栏(barrier)+序号(Sequencing)机制协调 ...
- Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介
Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...
- [转载]Linux 线程实现机制分析
本文转自http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 支持原创.尊重原创,分享知识! 自从多线程编程的概念出现在 Linux ...
随机推荐
- python基础-内置装饰器classmethod和staticmethod
面向对象编程之classmethod和staticmethod classmethod 和 staticmethod都是python内置的装饰器 classmethod 的作用:给在类内部定义的方法装 ...
- VUE 直接通过JS 修改html对象的值导致没有更新到数据中去
业务场景 我们在使用vue 编写 代码时,我们有一个 多行文本框控件,希望在页面点击一个按钮 在 文本框焦点位置插入一个 {pk}的数据. 发现插入 这个数据后,这个数据并没有同步到 数据中,但是直接 ...
- Ubuntu 18.04上安装Apache, MySQL, PHP, LAMP
1.安装 Apache $ sudo apt update && sudo apt install apache2 中间会遇到停顿询问是否继续, 输入 y 然后 回车. 2.测试 Ap ...
- pytest怎么标记用例?
pytest还有一个很强大的功能,那就是标记用例这个功能,这个功能可真的是很实用哒 首先,我们要实现标记功能,得分为3步走: 1.注册标记 2.标记用例 3.运行已经标记的用例. 那么第一步我们怎么实 ...
- 非main goroutine的退出及调度循环(15)
本文是<Go语言调度器源代码情景分析>系列的第15篇,也是第二章的第5小节. 上一节我们说过main goroutine退出时会直接执行exit系统调用退出整个进程,而非main goro ...
- CPDF_Document
auto pDoc = std::unique_ptr<CPDF_Document>(); pDoc->CreateNewDoc(); auto pDict = CPDF_Dicti ...
- c# 第七节 编程规范,vs中的各种设置
本节内容: 1:编程规范 2:vs中的各种设置 3:一个解决方案多个项目的创建.使用 1:编程规范 需要规范的地方: 1: 2: 2:vs中的各种设置 实现: 3:一个解决方案多个项目的创建.使用
- 201871010128-杨丽霞《面向对象程序设计(Java)》第十二周学习总结
201871010128-杨丽霞<面向对象程序设计(Java)>第十一周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- 201871020225-牟星源《面向对象程序设计(java)》第十三周学习总结
201871020225-牟星源<面向对象程序设计(java)>第十三周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- day28 8_7 网络编程之tcp协议
一.socket模块 socket模块就是用来网络搭建的模块,socket也叫套接字. 创建网络连接,需要使用两个模块进行模拟,一个作为server服务器端,一个作为client客户端. 在服务器端, ...