.Net并行编程之同步机制
一: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
.Net并行编程之同步机制的更多相关文章
- 转载 三、并行编程 - Task同步机制。TreadLocal类、Lock、Interlocked、Synchronization、ConcurrentQueue以及Barrier等
随笔 - 353, 文章 - 1, 评论 - 5, 引用 - 0 三.并行编程 - Task同步机制.TreadLocal类.Lock.Interlocked.Synchronization.Conc ...
- 三、并行编程 - Task同步机制。TreadLocal类、Lock、Interlocked、Synchronization、ConcurrentQueue以及Barrier等
在并行计算中,不可避免的会碰到多个任务共享变量,实例,集合.虽然task自带了两个方法:task.ContinueWith()和Task.Factory.ContinueWhenAll()来实现任务串 ...
- C#并行编程-线程同步原语
菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ...
- 【转】C#异步编程及其同步机制
C#异步编程及其同步机制 本篇文章涵盖一下几部分内容: 1. 什么是异步编程,为什么会需要异步编程 2. .NET下的异步编程及其发展 3. .NET线程同步机制及线程间数据封送 4. 异步模式 5. ...
- windows核心编程 - 线程同步机制
线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...
- Java:并行编程及同步使用方法
知道java可以使用java.util.concurrent包下的 CountDownLatch ExecutorService Future Callable 实现并行编程,并在并行线程同步时,用起 ...
- Linux程序设计学习笔记----多线程编程线程同步机制之相互排斥量(锁)与读写锁
相互排斥锁通信机制 基本原理 相互排斥锁以排他方式防止共享数据被并发訪问,相互排斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个相互排斥锁逻辑上绑定之后,对该资源的訪问操作例如以下: ...
- 四、并行编程 - 并行LINQ(PLINQ) 的使用。AsParallel
用于对内存中的数据做并行运算,也就是说其只支持 LINQ to Object 的并行运算 一.AsParallel(并行化) 就是在集合后加个AsParallel(). 例如: , ); == ); ...
- 二、并行编程 - Task任务
任务,基于线程池.其使我们对并行编程变得更简单,且不用关心底层是怎么实现的.System.Threading.Tasks.Task类是Task Programming Library(TPL)中最核心 ...
随机推荐
- Jfrog Artifactory jenkins 流水线使用docker的方式培训[暂未成功]
1. 创建jenkins的流水线 2. 创建artifactory的镜像仓库 3. 创建generic的仓库上传需要的 war包还有tar包. 4. 修改pipeline的 脚本 主要修改的地方. 修 ...
- 工资薪金VS劳务报酬
工资薪金所得与劳务报酬所得两个征税项目在个人所得税应纳税所得额的计算.征收标准等方面都有所不同,因而在实际操作中不可相互混淆. 工资薪金所得属于非独立个人劳务活动,即在机关.团体.学校.部队.企事业单 ...
- matlab中输入x. 与x的区别
参考:http://www.madio.net/thread-27742-1-1.html 点乘的话,是对应元素相乘. 没点的话,按照矩阵相乘法则进行,这就要求前一个矩阵的列数等于第二个矩阵的行数. ...
- Lucene最重要的功能是对一段话的分析
Lucene最重要的功能是对一段话的分析
- 与spring整合就是为了不用自己创建bean 让spring帮助我们创建bean
与spring整合就是为了不用自己创建bean 让spring帮助我们创建bean
- android 开发中 sdk 无法更新
现在用到android 的多个版本适配 , 换了个新环境 , 重新配置了android 的开发环境,哪想到遇到了很多小问题. 今天又遇到了 android sdk manager 无法更新的问题. ...
- A1097. Deduplication on a Linked List
Given a singly linked list L with integer keys, you are supposed to remove the nodes with duplicated ...
- 服务器内存占用不断的增加 & 任务管理器(PF使用率)不断的增加:关注句柄数
最近一二个月以来,我发现服务器的内存占用正按着每天60M的速度增加. 一台windows 2003的服务器(2G内存),刚刚启起时占用内存:600M左右. 运行20天后,内存占用(PF使用):1.8G ...
- MATLAB:图像乘除法运算(immultiply、imdivide函数),同时比较双精度类型图像运算结果
图像乘除法运算涉及到immultiply.imdivide函数,实现代码如下: 1.图像之间的乘法运算 close all; %关闭当前所有图形窗口,清空工作空间变量,清除工作空间所有变量 clear ...
- Java使用SFTP和FTP两种连接方式实现对服务器的上传下载 【我改】
[]如何区分是需要使用SFTP还是FTP? []我觉得: 1.看是否已知私钥. SFTP 和 FTP 最主要的区别就是 SFTP 有私钥,也就是在创建连接对象时,SFTP 除了用户名和密码外还需要知道 ...