Ben*_*lls 5 c# multithreading locking
我使用lock语句在 C# 中使用简单锁定。有没有办法确定有多少其他线程正在等待获得对象的锁定?我基本上想将等待锁定的线程数限制为 5。如果第六个线程需要获得锁定,我的代码将抛出异常。
这可以通过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表达式中使用的对象