如果初始计数为零,为什么信号灯会挂起?

时间:2018-11-10 20:43:52

标签: c# concurrency

此代码工作正常,它获取了一个信号量条目

static void Main(string[] args)
{
    Semaphore semaphore = new Semaphore(1, 1, "sem1");

    semaphore.WaitOne();

    Console.WriteLine("Press any Key to release semaphore");
    Console.ReadKey();

    semaphore.Release();
}

但是这要等待WaitOne()方法。

static void Main(string[] args)
{
    Semaphore semaphore = new Semaphore(0, 1, "sem1");

    semaphore.WaitOne();

    Console.WriteLine("Press any Key to release semaphore");
    Console.ReadKey();

    semaphore.Release();
}

我在这里缺少基本的东西吗?谢谢

1 个答案:

答案 0 :(得分:0)

您正在将可用请求的数量设置为零,然后尝试获取信号量。由于没有可用的请求,该线程将挂在信号量上,并等待其他线程释放它。

将信号量视为整数S。当您WaitOne时,会发生两件事

  • 如果S大于零,则将其减小一。
  • 如果S等于零,请暂停线程直到其不为零。

在第一个示例中,将其初始化为一个,然后获取。 在第二个中,将其初始化为零,以便线程等待。由于没有其他线程可以释放信号量,因此它会无限期地等待。