我正在使用lock
语句在C#中使用简单锁定。有没有办法确定有多少其他线程正在等待锁定对象?我基本上想要将等待锁定的线程数限制为5.如果第六个线程需要锁定,我的代码将抛出异常。
答案 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.Enter和Monitor.Exit
的快捷方式。我不认为你有机会获得等待对象的数量。
答案 2 :(得分:1)
您可以使用在lock语句之前递增的简单共享计数器(整数)。如果该值等于5,则让您的线程避免使用lock语句。然而,挑战是你需要锁定计数器以确保增量操作是原子的。
答案 3 :(得分:1)