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 ...
随机推荐
- C# GDI+绘制一维条码打印模糊的解决办法
最近遇到使用zxing生成的一维条码打印出来的条码图形很模糊根本识别不了.其实原因只有一句话: bitmap没有直接使用PrintDocument的Graphics画布进行绘制,而是中间处理了一下外部 ...
- es6可变参数-扩展运算符
es5中参数不确定个数的情况下: //求参数和 function f(){ var a = Array.prototype.slice.call(arguments); var sum = 0; a. ...
- vue-百度地图-maker文字标签显示隐藏
html: <div id="allmap" class="map"></div> script: mounted() { th ...
- svg(可缩放矢量图形)
入门推荐: http://www.ruanyifeng.com/blog/2018/08/svg.html (教程) http://www.runoob.com/svg/svg-reference.h ...
- laravel 远程一对多实例
/** * 关联楼宇推荐书关联表 * 远程一对一 */ public function buildingPanos() { return $this->hasManyThrough( 'App\ ...
- Comparable vs Comparator
Comparable interface can be used to provide single way of sorting whereas Comparator interface is us ...
- Qin Shi Huang's National Road System HDU - 4081(树形dp+最小生成树)
Qin Shi Huang's National Road System HDU - 4081 感觉这道题和hdu4756很像... 求最小生成树里面删去一边E1 再加一边E2 求该边两顶点权值和除以 ...
- 多进程multiprocessing
PACKAGE CONTENTS connection dummy (package) forking heap managers pool process queues reduction shar ...
- Django+Vue打造购物网站(十一)
第三方登录 微博创建应用,修改回调地址 http://open.weibo.com/authentication 安装第三方登录插件 https://github.com/python-social- ...
- 用Spring构建企业Java应用程序的方法
https://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247484965&idx=1&sn=ca6b847c65e506 ...