Подтвердить что ты не робот

Рекомендации по использованию блокировки

Я хотел бы знать, есть ли какие-либо рекомендации, над которыми должен следовать разработчик, когда (и где) размещать блокировки.

Например: я понимаю, что такой код должен быть заблокирован, чтобы избежать возможности неожиданного изменения значения 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()?

Есть ли какие-либо рекомендации, которые вы все должны учитывать при создании многопоточного кода?

4b9b3361

Ответ 1

Лучшее руководство для блокировки и нарезания резьбы, которое я нашел, - это страница (это текст, который я консультирую при работе с блокировкой и резьбой):

http://www.albahari.com/threading/

Я хочу, чтобы в параграфе "Блокировка и безопасность потоков", но прочитал и остальное, он очень хорошо написан.

Ответ 2

  • Заблокируйте как можно меньше, но насколько это необходимо.

  • Избегайте блокировок, когда это возможно - в .NET 4.0 есть альтернативы, которые не вызывают контекстный переключатель.

  • Старайтесь не блокировать несколько раз. Соответствуйте структуре API. Например, очередь. DeQueue - сделать альтернативный DeQueue (int amount), который может деактивировать многие элементы с помощью одной блокировки.

Ответ 3

Как насчет передачи сообщений вместо блокировки, отладка кода блокировки сложна