C#中的信号量


Semaphore 类允许您设置对临界区有访问权限的线程数量的限制。该类用于控制对资源池的访问。System.Threading.Semaphore 是 Semaphore 的命名空间,因为它包含实现 Semaphore 所需的所有方法和属性。

要在 C# 中使用信号量,您只需要实例化 Semaphore 对象的一个实例即可。它至少有两个参数:

参考

MSDN

序号构造函数和描述
1Semaphore(Int32,Int32)
初始化 Semaphore 类的新的实例,指定初始条目数和最大并发条目数。
2Semaphore(Int32,Int32,String) −
初始化 Semaphore 类的新的实例,指定初始条目数和最大并发条目数,并可选地指定系统信号量对象的名称。
3Semaphore(Int32,Int32,String,Boolean)
初始化 Semaphore 类的新的实例,指定初始条目数和最大并发条目数,可选地指定系统信号量对象的名称,并指定一个变量,该变量接收一个值,指示是否创建了一个新的系统信号量。

现在让我们看一个例子

在这里,我们使用了以下 Semaphore 构造函数,它初始化 Semaphore 类的新的实例,指定最大并发条目数,并可选地预留一些条目。

static Semaphore semaphore = new Semaphore(2, 2);

示例

实时演示

using System;
using System.Threading;
namespace Program
{
class Demo
   {
      static Thread[] t = new Thread[5];
      static Semaphore semaphore = new Semaphore(2, 2);
      static void DoSomething()
      {
         Console.WriteLine("{0} = waiting", Thread.CurrentThread.Name);
         semaphore.WaitOne();
         Console.WriteLine("{0} begins!", Thread.CurrentThread.Name);
         Thread.Sleep(1000);
         Console.WriteLine("{0} releasing...", Thread.CurrentThread.Name);
         semaphore.Release();
      }
      static void Main(string[] args)
      {
         for (int j = 0; j < 5; j++)
         {
            t[j] = new Thread(DoSomething);
            t[j].Name = "thread number " + j;
            t[j].Start();
         }
         Console.Read();
      }
   }
}

输出

以下是输出结果

thread number 2 = waiting
thread number 0 = waiting
thread number 3 = waiting
thread number 1 = waiting
thread number 4 = waiting
thread number 2 begins!
thread number 1 begins!
thread number 2 releasing...
thread number 1 releasing...
thread number 4 begins!
thread number 3 begins!
thread number 4 releasing...
thread number 0 begins!
thread number 3 releasing...
thread number 0 releasing...

更新于: 2020年4月1日

3K+ 浏览量

开启你的职业生涯

通过完成课程获得认证

开始学习
广告