2010-05-06 2 views
14

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

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

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

ответ

21

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

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

Yo хочет пункт «Блокировку и Потокобезопасность », но и прочесть остальные, это очень хорошо написано.

+1

спасибо, что является полезным ... но почему все примеры используют статические переменные-члены? есть проблемы с потокобезопасностью в переменных-членах класса, так? – miguel

+0

@miguel: можно заблокировать экземпляр элемента с помощью функции «lock (this)», пояснения и пример2 на этой странице предоставляют более подробную информацию: http://msdn.microsoft.com/en-us/library/c5kehkcz%28VS. 71% 29.aspx. Я думаю, что на сайте Albahari он использует статику, потому что тогда ему не нужно делать экземпляр класса, что делает его примеры короче. – user218447

+0

@miguel: ваш объект блокировки должен использоваться совместно с потоками, чтобы использовать его, а статический - это простой и простой способ сделать это. Статичность не является по своей сути злой, ее просто неправильно используют, как древние глобальные. –

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

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

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

-1

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

Смежные вопросы