Как замок будет реагировать на состояние гонки? - PullRequest
0 голосов
/ 18 февраля 2009

Как долго поток будет ожидать состояния гонки в следующем сценарии?

Файл добавлен в коллекцию:

 lock(mylock)
 {
     // add to collection
 }

Затем извлекается из коллекции аналогичным образом.

Если поток пытается добавить в коллекцию, когда служба удаляет его из коллекции, кто победит?

Или это точка состояния гонки, вы не можете предсказать, кто победит?

Ответы [ 4 ]

6 голосов
/ 18 февраля 2009

Как следует из названия, условие гонки означает, что гонка идет, и победить может каждый!

Использование 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);
    }
}
6 голосов
/ 18 февраля 2009

Если удаляющий поток попытается заблокировать первым, он владеет блокировкой, удаляет элемент (если он существует), снимает блокировку и движется дальше. Затем добавляющая нить захватывает замок и добавляет элемент. Конечный результат: элемент существует в коллекции.

Если добавляющий поток пытается заблокировать первым, он владеет блокировкой, добавляет элемент, снимает блокировку и движется дальше. Затем удаляющая нить захватывает замок и удаляет (только что добавленный) элемент. Конечный результат: элемент не существует в коллекции.

Ни один поток не будет ждать дольше, чем необходимо для добавления или удаления элемента из коллекции.

0 голосов
/ 23 октября 2009

Между «если» и «попытаться» есть разные расы. Например, если поток прерывается прямо между ними, он оставляет раздел кода заблокированным. Я не думаю, что это был вопрос вашего вопроса, но там все еще есть проблема.

0 голосов
/ 18 февраля 2009

Какой поток выдает блокировку первым, победит. Второй поток будет ждать, пока первый не снимет блокировку.

...