请说明信号量计数方案

时间:2019-04-04 23:32:45

标签: c# semaphore

在以下代码中:

    Semaphore semaphore = new Semaphore(3, 3);
    semaphore.WaitOne();
    int count = semaphore.Release();
    System.Diagnostics.Debug.WriteLine($"Count = {count}");

我将初始计数设置为3,然后将WaitOne()(递减为2),然后将Release()(递增回为3)。

那为什么是2? 我在这里想念什么?

2 个答案:

答案 0 :(得分:1)

按照documentationRelease方法:

  

退出信号量并返回上一个计数。

意味着调用它会导致您调用Release之前 可用的计数。

答案 1 :(得分:1)

  

我为什么要以前的计数?

简而言之,当前计数是没有意义的,该值可能已更改,然后您才能对其进行任何操作。因此,它代替了(正确的是)它为您提供了唯一的真实事实来源,即先前的计数(发布时)。

如果您真的很想要当前计数,则可以通过NtQuerySemaphore查询它,这是未记录的Win API调用。尽管实际上您不需要依赖于此,但是信号量的机制是您在任何正常使用中都需要的。

您也可以创建自己的互锁计数器,但是再次,这确实不是必须的