信号量(semaphore)支持 多并发(n>=1)同步锁

信号量(semaphore)是内核维护的一个Int32的变量。信号量为0时,在信号量上等待的线程会阻塞;信号量大于0时,就解除阻塞。主要方法:

Release():就是一个加1的操作

Release(int32 releasecount):就是一个加releasecount的操作。

初始化semaphore时,可以指定最大和最小信号量的值。

用Sempphore实现同样功能的同步锁,如下为一个只允许1个并发入口(即1次只能有一个线程访问)的示例:

 1  public class Program
 2     {
 3         private class SimpleWaitLock : IDisposable
 4         {
 5             private Semaphore m_semaphore = new Semaphore(1, 1);
 6             
 7             
 8             public void Enter()
 9             {
10                 m_semaphore.WaitOne();
11                 Console.WriteLine("Thread {0} Enter;",Thread.CurrentThread.Name);
12                 Thread.Sleep(100);
13                 Exit();
14             }
15             public void Exit()
16             {
17                 Console.WriteLine("Thread {0} Exit;", Thread.CurrentThread.Name);
18                 m_semaphore.Release();
19                 
20             }
21             public void Dispose()
22             {
23                 m_semaphore.Dispose();
24                 Console.WriteLine("Thread {0} dispose;", Thread.CurrentThread.Name);
25             }
26         }
27         static void Main()
28         {
29             SimpleWaitLock slock = new SimpleWaitLock();
30             for (int i = 0; i < 10; i++)
31             {
32                 Thread thread = new Thread(slock.Enter);
33                 thread.Name = "thread" + i.ToString();
34                 thread.Start();                
35             }
36             Console.Read();
37         }
38      
39 
40     }

结果为:

如将第5行改为(即允许2个并发入口):

private Semaphore m_semaphore = new Semaphore(2, 2);

则结果为:

原文地址:https://www.cnblogs.com/Finding2013/p/3012548.html