首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法确定在C#中等待锁定的线程数量?

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

Stack Overflow用户
提问于 2010-12-16 05:23:21
回答 4查看 3.8K关注 0票数 6

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-16 23:05:51

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

代码语言:javascript
复制
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表达式中使用的对象

票数 7
EN

Stack Overflow用户

发布于 2010-12-16 05:27:47

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

票数 2
EN

Stack Overflow用户

发布于 2010-12-16 05:26:30

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4455024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档