使用信号量等待资源的所有实例的可用性

时间:2016-01-03 21:23:15

标签: c# multithreading semaphore

在我正在构建的系统中,有两种用户--A和B - 可以使用资源R,其中有n个实例可用。 需要R的用户不断堆积在各自的队列中。

分配限制:

  1. 当m(m

  2. 当一个类型的用户(例如A)当前正在使用m(m

  3. 我正在尝试使用信号量来协调R对用户的分配。 Semaphore似乎没有直接支持约束1。

    为实现这一目标,我正在考虑采取以下措施:

    while(semaphore.CurrentCount < n)
        semaphore.Wait();
    

    有更好的方法吗?

    我看到SemaphoreSlim有一个方法Release(int32),它允许释放多个资源。

    我原本期望Wait(int32)允许等待特定的实例数量变得可用。 但是,提供的Wait(int32)API有不同的用途 - 此处的int32参数指定等待操作的超时。

    对应的Wait()和Release()API的语义之间的不对称是不是设计缺陷? 是否有其他一些SemaphoreSlim公开的API可以达到我的目的?

    我考虑使用CountDownEvent,但无论如何我还需要Semaphore用于其他约束。将两者结合使用 听起来很尴尬。我正试图单独使用Semaphore。

0 个答案:

没有答案