Рекомендации по использованию блокировки
Я хотел бы знать, есть ли какие-либо рекомендации, над которыми должен следовать разработчик, когда (и где) размещать блокировки.
Например: я понимаю, что такой код должен быть заблокирован, чтобы избежать возможности неожиданного изменения значения SomeHeapValue другого потока.
class Foo
{
public SomeHeapObject myObject;
public void DoSummat(object inputValue_)
{
myObject.SomeHeapValue = inputValue_;
}
}
Однако мой вопрос заключается в том, насколько глубоко вы идете с блокировкой? Например, если у нас есть этот код:
class Foo
{
public SomeHeapObject myObject;
public void DoSummat(object inputValue_)
{
myObject.SomeHeapValue = GetSomeHeapValue();
}
}
Должны ли мы заблокировать метод DoSummat (...) или заблокировать метод GetSomeHeapValue()?
Есть ли какие-либо рекомендации, которые вы все должны учитывать при создании многопоточного кода?
Ответы
Ответ 1
Лучшее руководство для блокировки и нарезания резьбы, которое я нашел, - это страница (это текст, который я консультирую при работе с блокировкой и резьбой):
http://www.albahari.com/threading/
Я хочу, чтобы в параграфе "Блокировка и безопасность потоков", но прочитал и остальное, он очень хорошо написан.
Ответ 2
-
Заблокируйте как можно меньше, но насколько это необходимо.
-
Избегайте блокировок, когда это возможно - в .NET 4.0 есть альтернативы, которые не вызывают контекстный переключатель.
-
Старайтесь не блокировать несколько раз. Соответствуйте структуре API. Например, очередь. DeQueue - сделать альтернативный DeQueue (int amount), который может деактивировать многие элементы с помощью одной блокировки.
Ответ 3
Как насчет передачи сообщений вместо блокировки, отладка кода блокировки сложна