0

在以下场景中,线程将等待竞争条件多长时间?

将文件添加到集合中:

 lock(mylock)
 {
     // add to collection
 }

然后以类似的方式将其从集合中删除。

如果一个线程在服务从集合中删除它时试图添加到集合中,谁会赢?

或者这是比赛条件的关键,你无法预测谁会赢?

4

4 回答 4

6

如果删除线程首先尝试锁定,则它拥有锁,删除项目(如果存在),释放锁,然后继续。然后添加线程获取锁并添加项目。最终结果:项目存在于集合中。

如果添加线程首先尝试锁定,它拥有锁,添加项目,释放锁,然后继续。然后删除线程抓住锁并删除(刚刚添加的)项目。最终结果:集合中不存在项目。

两个线程都不会等待超过从集合中添加或删除项目所需的时间。

于 2009-02-18T20:15:15.000 回答
6

顾名思义,比赛条件意味着比赛正在进行,任何人都可以获胜!

如您在此处显示的那样使用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);
    }
}
于 2009-02-18T20:19:46.830 回答
0

无论哪个线程先发出锁,都会获胜。第二个线程将等到第一个线程释放锁。

于 2009-02-18T20:18:14.277 回答
0

'if' 和 'try' 之间存在不同类型的竞争条件。例如,如果线程在两者之间中止,那么它会使代码部分锁定。我认为这不是你问题的重点,但那里仍然存在问题。

于 2009-10-23T18:44:37.743 回答