1、semaphore信号量类(又称信号灯)
用于控制对资源池的访问。线程通过调用semaphore的WaitOne进入信号量,通过调用semaphore的Release方法退出信号量。
信号量分为两种类型:局部信号量和已命名的系统信号量。如果您使用接受名称的构造函数创建 Semaphore 对象,则该对象与具有该名称的操作系统信号量关联。已命名的系统信号量在整个操作系统中都可见,可用于同步进程活动。您可以创建多个 Semaphore 对象来表示同一个已命名的系统信号量,也可以使用 OpenExisting 方法打开现有的已命名系统信号量。
局部信号量仅存在于您的进程内。您的进程中任何引用局部 Semaphore 对象的线程都可以使用它。每个 Semaphore 对象都是一个单独的局部信号量。
2、示例代码
-
using System;
-
using System.Threading;
- /*
- * 代码示例创建一个最大计数为 3、初始计数为 0 的信号量。此示例启动五个线程,这些线程都将阻止等待该信号量。
- * 主线程使用 Release(Int32) 方法重载,以便将信号量计数增加为其最大值,从而允许三个线程进入该信号量。
- * 每个线程都使用 Thread..::.Sleep 方法等待一秒钟以便模拟工作,然后调用 Release()()() 方法重载以释放信号量。
- * 每次释放信号量时,都显示前一个信号量计数。控制台消息对信号量的使用进行跟踪。
- * 每个线程的模拟工作间隔都稍有增加,以使输出更为易读。
- */
-
public class Example
-
{
- private static Semaphore __pool;
- private static int __padding;
- public static void Main()
- {
- __pool = new Semaphore(0,3); /* 限制最大同时运行值,初始值为0*/
- for(int i = 0; i = 5; i++)
- {
- Thread t = new Thread(new ParameterizedThreadStart(Worker));
- t.Start(i);
- }
- Thread.Sleep(500);
- Console.WriteLine("主线程调用Release(3)");
- __pool.Release(3);
- Console.WriteLine("主线程退出");
- Console.ReadLine();
- }
- private static void Worker(object num)
- {