none
MSDN里面的Semaphore类说明好像有错误

    问题

  • https://msdn.microsoft.com/zh-cn/library/system.threading.semaphore.aspx

    示例代码中给出了

    _pool = new Semaphore(0, 3);

    然而在实际运行中会出现一直WaitOne的情况,经过测试发现,要变成

    _pool = new Semaphore(3, 3);

    这种形式才能正常地waitone和release

    之前仔细看了好久构造函数及WaitOne和Release都是模凌两可的意思,你既可以理解成构造函数的初始入口数应该为最大数,也可以理解为0.

    然后给示例代码坑了好些时间

    2016年2月25日 13:44

答案

  • 第一个参数的意思是:

    initialCount

    Type: System.Int32

    The initial number of requests for the semaphore that can be granted concurrently. 

    下面有解释:

    If initialCount is less than maximumCount, the effect is the same as if the current thread had called WaitOne (maximumCount minus initialCount) times. If you do not want to reserve any entries for the thread that creates the semaphore, use the same number for maximumCount and initialCount.

    意思就是如果initialCount 小于maximumCount。就好像当前线程调用了WaitOne了maximumCount - initialCount  次。例如_pool = new Semaphore(0, 3);就相当于创建了3次的Semaphore,然后当前线程调用了三次WaitOne,这样就没有其它线程可以进入Semaphore,直到当前线程调用了Release. 

    如果你不想当前线程持有Semaphore,那么调用构造函数时用相等的maximumCount and initialCount。 像_pool = new Semaphore(3, 3);。其它线程有WaitOne的话,可以马上进入Semaphore。 

    示例代码运行没有问题,它在等待了500毫秒后,调用了_pool.Release(3);。然后其它线程就可以进入Semaphore了。


    • 已编辑 Simon Cai 2016年2月25日 22:53
    • 已标记为答案 Jenjyu_Lee 2016年2月27日 1:14
    2016年2月25日 22:52