Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用信号量等待资源所有实例的可用性_C#_Multithreading_Semaphore - Fatal编程技术网

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

C# 使用信号量等待资源所有实例的可用性,c#,multithreading,semaphore,C#,Multithreading,Semaphore,在我正在构建的系统中,有两种类型的用户—a和B—可以使用资源R,其中有n个实例可用。 需要R的用户在各自的队列中不断堆积 分配限制: 当m(m

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

分配限制:

  • 当m(m
  • 当m(m
  • 我试图使用一个信号量来协调R对用户的分配。 信号量似乎不直接支持约束1

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

    while(semaphore.CurrentCount < n)
        semaphore.Wait();
    
    while(semaphore.CurrentCount
    有更好的办法吗

    我看到SemaphoreSlim有一个方法发布(int32),它允许发布多个资源

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

    对应的Wait()和Release()API的语义之间的不对称不是设计缺陷吗? 信号量LIM公开的还有其他API吗

    我考虑改用CountDownEvent,但对于另一个约束,我仍然需要信号量。将两者结合使用
    听起来很尴尬。我只想用信号量就可以了。

    你能详细介绍一下“确保B型用户不会挨饿”吗?@YacoubMassad在上面进行了详细编辑,你不能不锁定就原子地等待(n)。您的
    while
    sure循环看起来很简单,但它不是线程安全的。您的需求非常复杂,因此您必须自己进行同步,因为没有现成的原语可以完全满足您的需要。谢谢Kirill…实际上,包含此代码的整个方法都是在锁下运行的…谢谢您提出它