使用Mutex类-互斥锁

owned为true,互斥锁的初始状态就是被主线程所获取,否则处于未获取状态

name为定义的互斥锁名称,在整个操作系统只有一个命名未CSharpThreadingCookbook的互斥量,一个线程得到,其他线程就无法得到这个互斥量了,只能等待。

const string mutexName = "CSharpThreadingCookbook";
public Mutex(bool initiallyOwned, string mutexName);
public Mutex();

WaitOne():获取,mut.ReleaseMutex():释放

public override bool WaitOne()
public static Mutex mutex = new Mutex();

//获取互斥锁,已经被其他线程获取,挂起等待。
mut.WaitOne();
//代码
//...
//... //释放锁
mut.ReleaseMutex();

SemaphoreSlim类,限制同一资源被同时访问的线程数量

有10个线程同时去访问数据库,借助信号类限制访问数据的并发线程数量,当有4个线程同时正在访问资源,其他线程必须等待,直至有资源执行完被释放。

class Program
{
static SemaphoreSlim _seamp = new SemaphoreSlim(4);
static void Main(string[] args)
{
for (int i = ; i <=; i++)
{
int j = i;
int sencondsToWait = + * i;
var t = new Thread(()=> { method(j.ToString(),sencondsToWait); });
t.Start();
}
Console.ReadLine();
}
static void method(string name,int senconds)
{
Console.WriteLine($"{name} waits to access a database");
_seamp.Wait();
Console.WriteLine($"{name} is completed");
Thread.Sleep(TimeSpan.FromSeconds(senconds));
_seamp.Release();
}
}

ManualResetEvent:线程间相互通信,一个线程开始一个活动,结束后告诉另一个线程可以进行执行了。

通过构造函数来控制 ManualResetEvent 的初始状态。

1.当初始值未false时,为非终止状态;_mre.WaitOne()阻塞线程,不允许线程访问下边的语句

static ManualResetEvent _mre = new ManualResetEvent(false);

2.当初始值未true时,为终止状态;_mre.WaitOne()允许线程访问下边的语句

static ManualResetEvent _mre = new ManualResetEvent(true);

在非终止状态时怎么让线程继续执行,怎么再让它停下来,这就要用了set()和Reset()方法了

  • 把非终止状态改为终止状态用Set()方法,告诉线程活动可以继续执行了(打开大门)
  • 把终止状态改为非终止状态用Reset()方法,阻塞线程直到再调用 Set()方法(关闭大门直至打开)

场景:

一个线程进行一个活动后,调用WaitOne()阻塞线程,等待其他线程给我信号我再继续执行。

另一个线程执行Set(),告诉正在等我执行完的线程,你可以执行了。随后Reset(),没有来得及执行的线程只能继续等待,直至再次接收信号。

CountDownEvent:信号类,等待直到一定数量的操作完成。

创建一个CountDownEvent实例,在构造函数中指定了当两个操作完成时会发出信号

static CountDownEvent _countDown = new CountDownEvent();
static void method()
{
Console.WriteLine("");
_countDown.Signal();
} var t1=new thread(()=>method());
t1.Start();
_countDown.Wait();
_countDown.dispose();
如果_countDown.Signal()没有达到指定的次数,那么_countDown.Wait()会一直等待,所以上面代码将会一值等待。

Barrier:像一个屏障,把所有线程任务的阶段隔离开来,当前阶段所有线程不完成,不会开始下一个阶段。

当屏障接收到所有的参与者,participantCount: 参与线程的数量,完成某个阶段的信号后,就会执行“阶段后代码”,

然后barrier.CurrentPhaseNumber会递增其值,表示要运行新的阶段,然后再解除阻塞每一个参与者的Task实例,然后所有参与者开始下一个阶段。

让【多个任务】在【不同阶段】同步一次(碰面),在继续往后执行。

        //同步两个线程,以及指定回调函数
static Barrier _barrier = new Barrier(, b => Console.WriteLine($"{b.CurrentPhaseNumber+1}当前阶段线程都执行完了,碰面一次") );
static void Main(string[] args)
{ var t1 = new Thread(() => Method_1());
var t2 = new Thread(() => Method_2());
t1.Start();
t2.Start();
Console.ReadLine();
} /// <summary>
/// 线程1要执行的方法
/// </summary>
public static void Method_1()
{
//模拟阶段一
Thread.Sleep(TimeSpan.FromSeconds());
Console.WriteLine("【阶段一】,线程【1】执行完毕");
_barrier.SignalAndWait(); //模拟阶段二
Thread.Sleep(TimeSpan.FromSeconds());
Console.WriteLine("【阶段二】,线程【1】执行完毕");
_barrier.SignalAndWait();
} /// <summary>
/// 线程2要执行的方法
/// </summary>
public static void Method_2()
{
//模拟阶段一
Thread.Sleep(TimeSpan.FromSeconds());
Console.WriteLine("【阶段一】,线程【2】执行完毕");
_barrier.SignalAndWait(); //模拟阶段二
Thread.Sleep(TimeSpan.FromSeconds());
Console.WriteLine("【阶段二】,线程【2】执行完毕");
_barrier.SignalAndWait(); }

运行结果:

最新文章

  1. innerHTML和innerText的区别
  2. 一些linux包相关命令
  3. POJ3250[USACO2006Nov]Bad Hair Day[单调栈]
  4. OpenXml Sdk 根据Word模板导出到word
  5. Django值Cookie基础
  6. SQL Server 2008及以上版本出现”SQL Server 复制需要有实际的服务器名称才能连接到服务器...“的问题解决
  7. [SHELL进阶] (转)最牛B的 Linux Shell 命令 (四)
  8. hdu - 1242 Rescue &amp;&amp; hdu - 2425 Hiking Trip (优先队列+bfs)
  9. windows版本git的下载地址
  10. 一个让你想到即可做到的web弹窗/层----Layer
  11. 4517: [Sdoi2016]排列计数
  12. Python开发【socket篇】解决粘包
  13. 【Eclipse】Eclipse 安装 SVN 插件的三种方法
  14. C# windows服务:C#windows服务中的Timer控件的使用
  15. 吴裕雄 oracle 管理数据表对象
  16. Vue图片懒加载插件 - vue lazyload的简单使用
  17. 对C转换说明符的误解以及关于数组的一些知识
  18. 再议FastReport.NET(转)
  19. 安卓程序代写 网上程序代写[原]ViewGroup(容器组件)详解(API解析)
  20. tomcat启动原理

热门文章

  1. c++文件编译的一些说明
  2. error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  3. spring持久类po或者javabean为什么常常实现序列化?
  4. Dapper入门教程(三)——Dapper Query查询
  5. Ubuntu虚拟机可以上网,可以ping网络,但是无法update和install,报连接不上服务器的错误解决方案:
  6. akoj-1319-四方定理
  7. xxe漏洞的学习与利用总结
  8. 53. Maximum Subarray【leetcode】
  9. 1.怎样控制div中的图片居中
  10. $($(&#39;.className&#39;).html( )选择器的工作原理