Правила использования блокировки - PullRequest
17 голосов
/ 06 мая 2010

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

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

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

Ответы [ 2 ]

22 голосов
/ 06 мая 2010

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

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

Вам нужен параграф «Блокировка и безопасность потоков», но прочитайте и остальное, он очень хорошо написан.

3 голосов
/ 06 мая 2010
  • Заблокируйте как можно меньше, но столько, сколько необходимо.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...