我使用lock语句在C#中使用简单的锁定。有没有办法确定有多少其他线程正在等待对象上的锁?我基本上希望将等待锁的线程数量限制在5个。如果第六个线程需要获取锁,我的代码将抛出一个异常。
发布于 2010-12-16 23:05:51
这可以通过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表达式中使用的对象
发布于 2010-12-16 05:27:47
lock语句是Monitor.Enter和Monitor.Exit的快捷方式。我不认为,您有机会获得等待对象的数量。
发布于 2010-12-16 05:26:30
您可以使用在lock语句之前递增的简单共享计数器(整数)。如果值等于5,那么让你的线程避免使用lock语句。然而,挑战在于您将需要锁定计数器以确保增量操作是原子的。
https://stackoverflow.com/questions/4455024
复制相似问题