信号量(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);
则结果为: