Как следует из названия, условие гонки означает, что гонка идет, и победить может каждый!
Использование 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);
}
}