C#任务同步
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using static System.Console; //任务同步
//1.lock 锁定一个引用类型的变量
/*死锁
lock (_s1)
{
lock (_s2)
{}
} lock (_s2)
{
lock (_s1)
{}
}
*/
//2.Interlocked类,更快但只支持少数几种的操作
//public int State
//{
// get
// {
// lock (this)
// {
// return ++_state;
// }
// }
//}
//相当于
//public int State
//{
// get
// {
// return Interlocked.Increment(ref _state);
// }
//} //3.Monitor类
//4.SpinLock结构,传递时需加引用,不然结构会以值传递
// 如果有大量锁定,如列表的每一个节点都有一个锁定,且锁定时间非常短,SpinLock结构就很有用
// 它与Monitor类似,Enter TryEnter Exit //5.WaitHandle 抽象基类 用于等待一个信号(WaitOne() WaitAll() ...)
//6.Mutex类 操作系统能识别有名称的互斥,可以跨线程,如果没有指定名称则不在不同的进程之间共享
//7.Semaphore类 非常类似于互斥,区别是它可以同时由多个线程使用,是一种计数的互斥
//8.Event类 事件与互斥和信号量一样,也是一个系统范围内的资源同步方法
// ManualResetEvent AutoResetEvent ManualResetEventSlim CountdownEvent
//9.Barrier类 ReaderWriterLockSlim类 //10.Timer类
// Threading中的Timer 基于XAML应用程序的DispatcherTimer namespace ConsoleApp
{
public class StateObject
{
private int _state = ;
private object _sync = new object(); public void ChangeState(int loop)
{ lock (_sync)//方法2.
{
if (_state == )
{
_state++;
Trace.Assert(_state == ,
$"Race condition occured after {loop} loops");
}
_state = ;
}
} }
class Program
{
static void Main(string[] args)
{
//RaceCondition(); object o = new object();
lock (o) { }
//lock由编译器解析为Monitor类
Monitor.Enter(o);
try { }
finally { Monitor.Exit(o); } //Monitor可以设置等待时间
bool _lockTaken = false;
Monitor.TryEnter(o, , ref _lockTaken);
if (_lockTaken)//get the lock
{
try { }
finally { Monitor.Exit(o); }
}
else { } //互斥
bool createNew;
//第3个为输出参数,接收一个表示互斥是否为新建的布尔值,
//如果(createNew)返回为false就表示互斥已经定义
var mutex = new Mutex(false, "ProCSharpMutex", out createNew); if (mutex.WaitOne())
{
try { }
finally { mutex.ReleaseMutex(); }
}
else
{
//some problem happened while waiting
} //信号量
int taskCount = ;
int semaphoreCount = ;
var semaphore = new Semaphore(semaphoreCount-, semaphoreCount);//初始请求数 最大请求数
try
{
int preCount = semaphore.Release();
WriteLine($"preCount: {preCount}");
}
catch (Exception) { } var tasks = new Task[taskCount];
for (int i = ; i < taskCount; ++i)
{
tasks[i] = Task.Run(() => TaskMain(semaphore));
}
Task.WaitAll(tasks);
WriteLine("All tasks finished"); //事件
AutoResetEvent autoEvent = new AutoResetEvent(false);
autoEvent.Reset();
autoEvent.Set(); autoEvent.WaitOne(); //Timer
using (var timer1 = new Timer(TimeAction, null, /*TimeSpan.FromSeconds(0)*/, /*TimeSpan.FromSeconds(3)*/))
{
Task.Delay().Wait();
} ReadKey();
} public static void RaceCondition()
{
var state = new StateObject();
//开启2个Task
for (int i = ; i < ; ++i)
{
Task.Run(() =>
{
int j = ;
while (true)
{
lock (state)//方法1.
{
state.ChangeState(j++);
}
}
});
}
} public static void TaskMain(Semaphore semaphore)
{
bool isComplete = false;
while(!isComplete)
{
if (semaphore.WaitOne())//等到 计数-1
{
try
{
WriteLine($"Task {Task.CurrentId} locks the semaphore");
Task.Delay().Wait();
}
finally
{
WriteLine($"Task {Task.CurrentId} release the semaphore");
semaphore.Release(); //释放 计数+1
isComplete = true;
}
}
else
{
WriteLine($"Timeoue for task {Task.CurrentId}; wait again");
}
}
} private static void TimeAction(object o)
{
WriteLine($"System.Threading.Timer {DateTime.Now:T}");
} }
}
C#任务同步的更多相关文章
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- FFmpeg学习6:视音频同步
在上一篇文章中,视频和音频是各自独立播放的,并不同步.本文主要描述了如何以音频的播放时长为基准,将视频同步到音频上以实现视音频的同步播放的.主要有以下几个方面的内容 视音频同步的简单介绍 DTS 和 ...
- SQLServer事务同步下如何收缩日志
事务同步是SQLServer做读写分离的一种常用的方式. 随着业务数据的不断增长,数据库积攒了大量的日志,为了腾出硬盘空间,需要对数据库日志进行清理 订阅数据库的日志清理 因为订阅数据库所有的数据都来 ...
- 多线程的通信和同步(Java并发编程的艺术--笔记)
1. 线程间的通信机制 线程之间通信机制有两种: 共享内存.消息传递. 2. Java并发 Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式执行,通信的过程对于程序员来说是完全透 ...
- .NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?
配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.要了解配置同步机制的实现原理,先得从认识一个 ...
- C#多线程之线程同步篇3
在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ...
- C#多线程之线程同步篇2
在上一篇C#多线程之线程同步篇1中,我们主要学习了执行基本的原子操作.使用Mutex构造以及SemaphoreSlim构造,在这一篇中我们主要学习如何使用AutoResetEvent构造.Manual ...
- C#多线程之线程同步篇1
在多线程(线程同步)中,我们将学习多线程中操作共享资源的技术,学习到的知识点如下所示: 执行基本的原子操作 使用Mutex构造 使用SemaphoreSlim构造 使用AutoResetEvent构造 ...
- [.NET] 怎样使用 async & await 一步步将同步代码转换为异步编程
怎样使用 async & await 一步步将同步代码转换为异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/6079707.html ...
- Javascript 代理模式模拟一个文件同步功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- 【题解】洛谷P3660 [USACO17FEB]Why Did the Cow Cross the Road III
题目地址 又是一道奶牛题 从左到右扫描,树状数组维护[左端点出现而右端点未出现]的数字的个数.记录每个数字第一次出现的位置. 若是第二次出现,那么删除第一次的影响. #include <cstd ...
- flask(二)之Jinja2模板与Flask-WTF
01-文档 官方文档:http://docs.jinkan.org/docs/jinja2/ 02-基本语义 Jinja2做构成的模板文件中,文本内容大致可以分成几个种类.比如特殊文本(不进行转义,比 ...
- SqlServer2008_r2安装功能选择
勾上数据引擎服务.客户端工具链接.sdk.管理工具.客户连接SDK.最后一个 sql2008安装时,怎么选择服务账户NT Authority\System ,系统内置账号,对本地系统拥有完全控制权限: ...
- 【学习总结】GirlsInAI ML-diary day-10-if条件执行
[学习总结]GirlsInAI ML-diary 总 原博github链接-day10 认识if条件执行 一般条件执行 分支执行 链式条件执行 嵌套条件执行 1-if一般条件执行 格式:如果(满足这个 ...
- js中的枚举
在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的.可枚举性决定了这个属性能否被for…in查找遍历到. js中基本包装类型的原型属性是不可枚举的 ...
- Shell命令-系统信息及显示之uname、hostname
文件及内容处理 - uname.hostname 1. uname:显示系统信息 uname命令的功能说明 uname 命令用于显示系统信息.uname 可显示电脑以及操作系统的相关信息 uname命 ...
- Python学习之路——三元运算符推导式
三元运算符 # 生成器:包含yield关键字的函数就是生成器 def my_generator(): yield 1 yield 2 yield 3 g_obj = my_generator() # ...
- How to proof MD5
F(X, Y, Z) = (X&Y) | ((~X) & Z) G(X, Y, Z) = (X&Z) | (Y & (~Z)) H(X, Y, Z) = X^Y^Z I ...
- Hive 口袋手册
2019-04-01 关键字:Hive 学习总结.Hive 基础 . Hive 进阶 .Hive 调优 . Hive 入门手册.Hive PDF 下载 本篇文章系本人就目前所掌握的知识对 Apache ...
- 指数型生成函数 及 多项式求ln
指数型生成函数 我们知道普通型生成函数解决的是组合问题,而指数型生成函数解决的是排列问题 对于数列\(\{a_n\}\),我们定义其指数型生成函数为 \[G(x) = a_0 + a_1x + a_2 ...