在以下场景中,线程将等待竞争条件多长时间?
将文件添加到集合中:
lock(mylock)
{
// add to collection
}
然后以类似的方式将其从集合中删除。
如果一个线程在服务从集合中删除它时试图添加到集合中,谁会赢?
或者这是比赛条件的关键,你无法预测谁会赢?
在以下场景中,线程将等待竞争条件多长时间?
将文件添加到集合中:
lock(mylock)
{
// add to collection
}
然后以类似的方式将其从集合中删除。
如果一个线程在服务从集合中删除它时试图添加到集合中,谁会赢?
或者这是比赛条件的关键,你无法预测谁会赢?
如果删除线程首先尝试锁定,则它拥有锁,删除项目(如果存在),释放锁,然后继续。然后添加线程获取锁并添加项目。最终结果:项目存在于集合中。
如果添加线程首先尝试锁定,它拥有锁,添加项目,释放锁,然后继续。然后删除线程抓住锁并删除(刚刚添加的)项目。最终结果:集合中不存在项目。
两个线程都不会等待超过从集合中添加或删除项目所需的时间。
顾名思义,比赛条件意味着比赛正在进行,任何人都可以获胜!
如您在此处显示的那样使用lock(obj)
将导致线程阻塞(等待),直到所有其他线程释放它们对obj
. 这可能永远不会发生。
lock (obj)
{
// stuff
}
……相当于……
Monitor.Enter(obj);
try
{
// stuff
}
finally
{
Monitor.Exit(obj);
}
如果您想强制锁定超时,请改用此表单:
if (!Monitor.TryEnter(obj, timeout))
{
// handle the fact that you couldn't lock
}
else
{
try
{
// stuff
}
finally
{
Monitor.Exit(obj);
}
}
无论哪个线程先发出锁,都会获胜。第二个线程将等到第一个线程释放锁。
'if' 和 'try' 之间存在不同类型的竞争条件。例如,如果线程在两者之间中止,那么它会使代码部分锁定。我认为这不是你问题的重点,但那里仍然存在问题。