有什么方法可以确定在 C# 中等待锁定的线程数吗?

Ben*_*lls 5 c# multithreading locking

我使用lock语句在 C# 中使用简单锁定。有没有办法确定有多少其他线程正在等待获得对象的锁定?我基本上想将等待锁定的线程数限制为 5。如果第六个线程需要获得锁定,我的代码将抛出异常。

Bri*_*eon 6

这可以通过Semaphore类轻松实现。它会为你计算。请注意,在下面的代码中,我使用信号量对等待资源的线程数进行非阻塞检查,然后使用普通的 oldlock来实际序列化对该资源的访问。如果有超过 5 个线程在等待资源,则会引发异常。

public class YourResourceExecutor
{
  private Semaphore m_Semaphore = new Semaphore(5, 5);

  public void Execute()
  {
    bool acquired = false;
    try
    {
      acquired = m_Semaphore.WaitOne(0);
      if (!acquired)
      {
        throw new InvalidOperationException();
      }
      lock (m_Semaphore)
      {
        // Use the resource here.
      }
    }
    finally
    {
      if (acquired) m_Semaphore.Release();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这种模式有一个显着的变化。您可以将方法的名称更改为TryExecute并让它返回 abool而不是抛出异常。这完全取决于你。

请记住,锁表达式中使用的对象不是锁的主体。它仅用作同步代码块的标识符。任何使用同一对象获取锁的代码块都将被有效地序列化。被“锁定”的是代码块,而不是lock表达式中使用的对象