有没有办法确定等待在C#中锁定的线程数?

时间:2010-12-15 21:23:21

标签: c# multithreading locking

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

4 个答案:

答案 0 :(得分:3)

这可以通过Semaphore课轻松完成。它会为你做计数。请注意,在下面的代码中,我使用信号量对等待资源的线程数进行非阻塞检查,然后使用普通的旧lock来实际序列化对该资源的访问。如果有超过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();
    }
  }
}

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

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

中使用的对象

答案 1 :(得分:2)

lock语句是Monitor.EnterMonitor.Exit的快捷方式。我不认为你有机会获得等待对象的数量。

答案 2 :(得分:1)

您可以使用在lock语句之前递增的简单共享计数器(整数)。如果该值等于5,则让您的线程避免使用lock语句。然而,挑战是你需要锁定计数器以确保增量操作是原子的。

答案 3 :(得分:1)

不,lock()使用Monitor class并且没有成员来查找排队的线程数。

您可以指定超时。

坦率地说,当队列填满时抛出一个异常听起来像个坏主意。