【深度好文】多线程之WaitHandle-->派生-》Semaphore信号量构造
2017-01-19 10:58
344 查看
Semaphore 继承自WaitHandle。
信号量说简单点就是为了线程同步,或者说是为了限制线程能运行的数量。
那它又是怎么限制线程的数量的哩?是因为它内部有个计数器,比如你想限制最多5个线程运行,那么这个计数器的值就会被设置成5,如果一个线程调用了 这个Semaphore,那么它的计数器就会相应的减1,直到这个计数器变为0。这时,如果有另一个线程继续调用这个Semaphore,那么这个线程就 会被阻塞(计数器都被WaitOne()方法调用每次减1 减完了)。
获得Semaphore的线程处理完它的逻辑之后,你就可以调用它的Release()或Release(1)函数将它的计数器重新加1,这样其它被阻塞的线程就可以得到调用了。
Full codes:
信号量说简单点就是为了线程同步,或者说是为了限制线程能运行的数量。
//创建一个限制资源类 //资源数为5,开放资源数为2 //主线程自动占有3个资源 semaphore = new Semaphore(2, 5);
那它又是怎么限制线程的数量的哩?是因为它内部有个计数器,比如你想限制最多5个线程运行,那么这个计数器的值就会被设置成5,如果一个线程调用了 这个Semaphore,那么它的计数器就会相应的减1,直到这个计数器变为0。这时,如果有另一个线程继续调用这个Semaphore,那么这个线程就 会被阻塞(计数器都被WaitOne()方法调用每次减1 减完了)。
获得Semaphore的线程处理完它的逻辑之后,你就可以调用它的Release()或Release(1)函数将它的计数器重新加1,这样其它被阻塞的线程就可以得到调用了。
Full codes:
class SemaphoreDemo { static Semaphore semaphore; static void Main(string[] args) { //创建一个限制资源类 //资源数为5,开放资源数为2 //主线程自动占有3个资源 semaphore = new Semaphore(2, 5); //开启3个线程,让它们竞争剩余的2个资源 for (int i = 0; i < 3; i++) { Thread t = new Thread(new ParameterizedThreadStart(WorkerProc)); t.Name = "Thread" + i; t.Start(t.Name); } System.Console.ReadKey(); } static void WorkerProc(Object obj) { Console.WriteLine(string.Format("线程:{0}准备执行",obj)); semaphore.WaitOne(); Console.WriteLine(string.Format("线程:{0}开始执行了,停留5秒钟", obj)); Thread.Sleep(5000); Console.WriteLine(string.Format("线程:{0}执行结束了,释放信号量", obj)); semaphore.Release(); }
相关文章推荐
- 【深度好文】多线程之WaitHandle-->派生EventWaitHandle事件构造-》AutoResetEvent、ManualResetEvent
- 【深度好文】多线程之WaitHandle-->派生-》Mutex信号量构造
- 基元线程同步——内核模式构造(WaitHandle,EventWaitHandle,AutoResetEvent,ManualResetEvent,Semaphore,Mutex)
- 基元线程同步——内核模式构造(WaitHandle,EventWaitHandle,AutoResetEvent,ManualResetEvent,Semaphore,Mutex)
- C# 多线程之信号量Semaphore
- C#的WaitHandle : 管理多线程状态
- WaitHandle——使用Semaphore
- Java多线程-新特征-信号量Semaphore
- C#多线程那点事——信号量(Semaphore)
- Java多线程:Semaphore信号量
- JAVA多线程--信号量(Semaphore)
- 秒杀多线程第八篇---经典线程同步 信号量Semaphore
- WaitHandle——使用Semaphore
- C#多线程那点事——信号量(Semaphore)
- dispatch_semaphore_signal和dispatch_semaphore_wait信号量
- Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例 (r)
- c# 多线程 创建跨进程的EventWaitHandle 源码
- 秒杀多线程第八篇 经典线程同步 信号量Semaphore
- JAVA 多线程之信号量(Semaphore)实例详解
- Error: semaphore wait has lasted > 600 seconds导致数据库实例重启