C#线程等待句柄

互斥对象 Mutex

private Mutex m = new Mutex();

public void Method(){ m.WaitOne(); //执行操作 m.ReleaseMutex(); }

共享资源Semaphore

Semaphore是一个信号量,可以让多个资源分类型的同时进行。书中一个重要的有代表性的例子就是图书馆有多个电脑,有若干个人使用电脑的问题。是一个不错的例子。
有一个计数器,当信号量达到指定的最大值,就会阻塞。等待释放信号。方便协调工作。
思考:semaphore可以用作某个需要大量发送数据,但是有限的线程来处理的情况,比如说1200个人需要同时受到一条信息,但是用了40个线程来发送。

轻量级的SemaphoreSlim

SemaphoreSlim和semaphore的作用是一样的。但是SempahoreSlim是轻量级的,不是内核级别的,所以消耗资源比较少,效率更高,个人十分喜欢轻量级的东西。

EventWaitHandle 等待事件的发生

主要分为:ManualResetEvent和AuthoResetEvnt两个
主要是设计一个无限循环的函数来等待条件到来以后执行某个事情。在事情到来前,先停下来等待。
个人在现货交易软件中,行情的发送使用了ManualRestEvent。因为我们无法确定行情什么时候到来,所以让行情到来之前等待,行情一旦受到,立马.Set(),释放信号。

CountDownEvent 倒计时计数器

当所有的计数到了0以后,阻塞才会放开,让系统继续执行。
这个函数可以用在需要多个线程执行某些操作,条件具备以后。开始执行下一步的操作,比如在金融分析系统登录前,我们需要下载系统品种,历史数据,新闻消息,等等多个信息的下载,这些信息的下载不适合在一个线程中去执行。我们把每个操作一个线程,等这些线程都结束以后,我们开始开启主程序。用CountDownEvent非常合适

分阶段同步 Barrier

书中举得例子很好,小王和小李相约去参观鸟巢,小王和小李各自从自己的家出发,会到鸟巢门口集合。集合以后去参观鸟巢,参观完了以后。然后各自回家。
小王和小李,每个人的情况不一样,所以他们需要等待彼此都到了鸟巢以后,再开始参观,参观的时间可能也不太一样,等参观完了,需要集结。然后再各自回家,每一个集结点,都是一个分步。适合用barrier.

你可能感兴趣的:(多线程,C#)