2013-05-23 2 views
1

Я изо всех сил стараюсь выбрать из этих двух подходов, многие из ответов здесь одобряют тот или иной. Мне нужно руководство, чтобы выбрать лучшее для моей ситуации.Двойной замок конкретного случая C#

lock (lockObject) 
lock (lockObject2) { 
    // two critical portions of code 
} 

против:

lock (lockObject) 
{ 
    //first critical portion for lockObject 
    lock (lockObject2) { 
     //critical portion for lockObject2 and lockObject 
    } 
} 

Второй пример помечается как плохая практика по Coverity, и я хочу, чтобы перейти к первому, если это нормально, чтобы сделать это.

Какое из двух является лучшим (и, к лучшему, я имею в виду качество кода и меньшее количество проблем в долгосрочной перспективе)? И почему?

Редактировать 1: Первый замок используется, в частности, для этого случая.

+1

'// критическая часть для lockObject2', разве это не критично для * обоих * блокировок? В противном случае вы бы не вложили их, не так ли? – Medinoc

+0

Да, вы правы. Будет ли редактировать q –

ответ

2

«Лучший» субъективен и зависит от контекста. Одна из проблем заключается в том, что вы можете рисковать взаимоблокировками, если какой-либо код использует одни и те же блокировки в другом порядке. Если у вас есть вложенные блокировки, то лично как минимум Я бы использовал блокировку с таймаутом (и создание исключения) - исключение лучше, чем тупик. Преимущество, заключающееся в том, что вы сразу же забираете оба замка, - это то, что вы знаете, что можете их получить, прежде чем начинать работу. Преимущество не заключается в том, что вы сокращаете время блокировки на lockObject2.

Лично я бы искать способы, чтобы сделать это:

lock (lockObject) { 
    //critical portion for lockObject 
} 
lock (lockObject2) { 
    //critical portion for lockObject2 
} 

Это имеет преимущества обоих, без недостатков, либо - если вы можете реструктурировать код, чтобы сделать это.

+0

Извините за то, что вы вводите вас в заблуждение, я обновил вопрос –

+0

@ Floradu88 достаточно справедлив; основная часть моего ответа остается прежней. –

+0

Да, к сожалению, я не могу разбить код на две отдельные части кода для каждой из замков. –

0

Редактировать: Я сказал не то. Первый блокирует первый замок, затем блокирует вторую блокировку для части кода, а затем автоматически разблокирует ее. Второй пример блокирует первый, затем блокирует второй, а затем обе части кода заканчиваются, оба разблокированы. Лично я предпочел бы второй вариант, так как он автоматически разблокирует оба замка. Но, как комментировал кто-то, остерегайтесь тупиков. Это может произойти, если другой поток заблокирован в обратном порядке.

+0

Извините, что вы вводите вас в заблуждение, ребята, я уточнил вопрос –

1

В зависимости от случая вы столкнулись:

  • Если это возможно, первый замок является релиз, не касаясь второй замок его возможным убыстрение к приложению, потому что второй замок не будет заблокирован, не будучи используемый.
  • Если всегда оба замка используются Я предпочитаю первый случай для читаемости

Edit: Я думаю, что это не возможно, чтобы сказать это без дополнительной информации. Чтобы замки были как можно короче, вам необходимо зафиксировать как можно позже. Во всяком случае, могут быть случаи, когда вы хотите получить оба замка одновременно.

+0

Извините за то, что вы вводите вас в заблуждение, я обновил вопрос. –

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