并行编程之CountdownEvent的用法
一:Barrier(屏障同步)
二:spinLock(自旋锁)
信号量
一:CountdownEvent
虽然通过Task.WaitAll()方法也可以达到线程同步的目的。
但是CountdownEvent更牛X之处在于我们可以动态的改变“信号计数”的大小,比如一会儿能够容纳8个线程,一下又4个,一下又10个,CountdownEvent给我们提供了可以动态修改的解决方案。
模拟建房子工序
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} static CountdownEvent cde = null;
private void button1_Click(object sender, EventArgs e)
{
//建房子第一期工人
string[] _bhPerson1 = new string[] { "Yan", "Zhi", "wei", "Do", "Work" };
//建房子第二期工人
string[] _bhPerson2 = new string[] { "Yan2", "Zhi2", "wei2" };
//建房子第三期工人
string[] _bhPerson3 = new string[] { "Yan3", "Zhi3", "wei3" };
using (cde = new CountdownEvent(Environment.ProcessorCount))//开始监管,相当于监工
{
cde.Reset(_bhPerson1.Length);//设置第一期建造需要5个人
foreach (string person in _bhPerson1)
{
Task.Factory.StartNew(() =>
{
BuilderHourseStep1(person);
}); }
cde.Wait();//等待第一期建造完成
Console.WriteLine("-----------------------"); cde.Reset(_bhPerson2.Length);//设置第二期建需要三个人
foreach (string person in _bhPerson2)
{
Task.Factory.StartNew(() =>
{
BuilderHourseStep2(person);
});
}
cde.Wait();//等待第二期建造完成
Console.WriteLine("-----------------------"); cde.Reset(_bhPerson3.Length);//设置第三期建需要三个人
foreach (string person in _bhPerson3)
{
Task.Factory.StartNew(() =>
{
BuilderHourseStep3(person);
});
}
cde.Wait();//等待第三期建造完成
Console.WriteLine("-----------------------");
}
}
/// <summary>
/// 建房子第一道所需要的工序
/// </summary>
/// <param name="person"></param>
static void BuilderHourseStep1(string person)
{
try
{
Console.WriteLine(string.Format("『{0}』BuilderHourseStep1....", person));
}
finally
{
cde.Signal();//建造完成一点后,通知监工
}
}
/// <summary>
/// 建房子第二道所需要的工序
/// </summary>
/// <param name="person"></param>
static void BuilderHourseStep2(string person)
{
try
{
Console.WriteLine(string.Format("『{0}』BuilderHourseStep2.....", person));
}
finally
{
cde.Signal();
}
}
/// <summary>
/// 建房子第三道所需要的工序
/// </summary>
/// <param name="person"></param>
static void BuilderHourseStep3(string person)
{
try
{
Console.WriteLine(string.Format("『{0}』BuilderHourseStep3.......", person));
}
finally
{
cde.Signal();
}
}
}
分步执行任务
static void Main(string[] args)
{
IList<string> taskList =new List<string> {"任务一","任务二", "任务四", "任务五", "任务六" };
int count = taskList.Count;
using (CountdownEvent cde = new CountdownEvent(Environment.ProcessorCount))
{
cde.Reset(count);//设置信号数
foreach (var item in taskList)
{
Task.Factory.StartNew(() =>
{
Console.WriteLine("处理任务:"+item);
cde.Signal();//每次调用 Signal 时,信号计数都会递减 1。
});
}
cde.Wait();// 在主线程上,对 Wait 的调用将会阻塞,直至信号计数为零。
Console.WriteLine("接下来开始做下一件事情");
cde.Reset(count);//重置信号数
foreach (var item in taskList)
{
Task.Factory.StartNew(() =>
{
Console.WriteLine("继续处理任务:" + item);
cde.Signal();//每次调用 Signal 时,信号计数都会递减 1。
});
}
}
Console.ReadKey();
}
二:SemaphoreSlim
三: ManualResetEventSlim
教程
http://blog.gkarch.com/threading/part5.html#the-parallel-class
http://www.cnblogs.com/huangxincheng/archive/2012/04/08/2437701.html
http://www.cnblogs.com/yaopengfei/p/8315212.html
并行编程之CountdownEvent的用法的更多相关文章
- 并行编程之PLINQ
并行编程之PLINQ 并行 LINQ (PLINQ) 是 LINQ 模式的并行实现.PLINQ 的主要用途是通过在多核计算机上以并行方式执行查询委托来加快 LINQ to Objects 查询的执行速 ...
- .Net并行编程之二:并行循环
本篇内容主要包括: 1.能够转化为并行循环的条件 2.并行For循环的用法:Parallel.For 3.并行ForEach的用法Parallel.ForEach 4.并行LINQ(PLINQ)的用法 ...
- Java并发编程之CountDownLatch的用法
一.含义 CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能.CountDownLatch是一个同步的辅助类,它可以允许一个或多个线程等待, ...
- Pthreads并行编程之spin lock与mutex性能对比分析(转)
POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API.线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用 ...
- Shell编程之Shift的用法
位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift 1. 非常 ...
- Python网络编程之TCP套接字简单用法示例
Python网络编程之TCP套接字简单用法示例 本文实例讲述了Python网络编程之TCP套接字简单用法.分享给大家供大家参考,具体如下: 上学期学的计算机网络,因为之前还未学习python,而jav ...
- 异步编程之Promise(3):拓展进阶
异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...
- 深入浅出Cocoa多线程编程之 block 与 dispatch quene
深入浅出 Cocoa 多线程编程之 block 与 dispatch quene 罗朝辉(http://www.cppblog.com/kesalin CC 许可,转载请注明出处 block 是 Ap ...
- [Cocoa]深入浅出Cocoa多线程编程之 block 与 dispatch quene
深入浅出 Cocoa 多线程编程之 block 与 dispatch quene 罗朝辉(http://www.cppblog.com/kesalin CC 许可,转载请注明出处 block 是 Ap ...
随机推荐
- JQuery基础教程:选择元素(中)
自定义选择符 JQuery在各种CSS选择符的基础上还添加了独有的完全不同的自定义选择符,注意,只要可能,jQuery就会使用浏览器原生的DOM选择符引擎去查找元素.但在使用自定义选择符的时候,就无法 ...
- 让EntityFramework6支持SQLite
最近给朋友的小孩做了一个毕业设计.用的是asp.net MVC5 + EntityFramework6 + SQL Server 2008. 结果做好后,朋友说能不能不要数据库,直接运行?顿时让我很纠 ...
- OpenGL: 渲染管线理论
http://blog.csdn.net/augusdi/article/details/19934463 学习着色器,并理解着色器的工作机制,就要对OpenGL的固定功能管线有深入的了解. 首先要知 ...
- 关于lambda表达式在javascript中的使用
了解过js函数的同学应该都知道js的函数有很多种创建方式. 如: function fun(){}: var fun=function(){}: 但最近的学习中发现了lambda表达式型的创建js的匿 ...
- Can brain stimulation aid memory and brain health?
Can brain stimulation aid memory and brain health? Harvard Women’s Health Watch Image: Thinkstock Th ...
- 【测试】DG的主切备,备切主
1.首先要应用日志,保持主备库一致: 备库:SBDB@SYS> recover managed standby database using current logfile disconnect ...
- Android各个文件夹对应的分辨率?
- ionic ngcordova barcodescanner
二維碼掃描 最近有一個項目用到了 二維碼的掃描 總結一下 記錄一下 1. ionic platform add ios 2. 添加插件 cordova plugin add https://gi ...
- WWF3控制流程类型活动<第二篇>
一.顺序工作流 顺序活动是WWF工作流中最基本.最简单的容器类型的活动.顺序活动可以作为很多其他活动的分支. 代码: private void CodeExecute1(object sender, ...
- markdown语法学习源码
__注: 结合markdown官方文档 其中大部分例子和说明文字都摘自官方文档__官方链接:[Markdown: Basics (快速入门)](http://wowubuntu.com/markdow ...