C# 中的信号量
csharpprogrammingserver side programming更新于 2025/9/9 5:37:17
信号量类允许您限制访问临界区的线程数量。该类用于控制对资源池的访问。System.Threading.Semaphore 是 Semaphore 的命名空间,因为它包含实现 Semaphore 所需的所有方法和属性。
要在 C# 中使用信号量,您只需实例化一个 Semaphore 对象即可。它至少有两个参数 −
Reference
−
MSDN
| Sr.No. | 构造函数和说明 |
|---|---|
| 1 | Semaphore(Int32,Int32) 初始化 Semaphore 类的新实例,指定初始条目数和最大并发条目数。 |
| 2 | Semaphore(Int32,Int32,String) − 初始化 Semaphore 类的新实例,指定初始条目数和最大并发条目数,并可选择指定系统信号量对象的名称。 |
| 3 | Semaphore(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...

