Почему использование SyncLocks в.NET для простых операций, когда Взаимно блокируемый класс доступен?

Я делал простую многопоточность в VB.NET некоторое время и только что вошел в мой первый большой многопоточный проект. Я всегда делал все с помощью Synclock оператор, потому что я не думал, был лучшим путем.

Я просто узнал о Interlocked Класс - это заставляет его посмотреть как будто все это:

Private SomeInt as Integer
Private SomeInt_LockObject as New Object

Public Sub IntrementSomeInt
    Synclock SomeInt_LockObject
        SomeInt += 1
    End Synclock
End Sub

Может быть заменен отдельным оператором:

Interlocked.Increment(SomeInt)

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

Есть ли причина, почему я был бы, прокручивая мою собственную блокировку, с помощью выделенных объектов блокировки, когда я могу выполнить то же самое с помощью Interlocked методы?

9
задан SqlRyan 28 March 2010 в 21:03
поделиться

4 ответа

Вы правы; Здесь следует использовать Interlocked , он будет быстрее, чем SyncLock .
Однако класс Interlocked малоизвестен.

Однако бывают ситуации, когда вам нужно использовать SyncLock и Interlocked не поможет.

9
ответ дан 4 December 2019 в 10:03
поделиться

Короткий ответ: используется блокировка Monitor ( SyncLock в VB и блокировка {} в C #) не только гарантирует, что только один поток одновременно может получить доступ к переменной (или, строго говоря, только один поток за раз может получить блокировку для объекта блокировки), но также создает память барьер, необходимый для гарантии того, что чтение переменной не будет оптимизировано.

Если вы никогда не просто читаете значение переменной (другими словами, вся ваша работа выполняется через вызовы Interlocked ), тогда все будет в порядке. Однако, если вам нужно иметь возможность выполнить обычное чтение переменной, ситуация более сложная.Чтение / запись без блокировки обычно выполняются в C # с использованием ключевого слова volatile . Это инструктирует компилятор читать значение переменной везде, где оно используется, вместо того, чтобы оптимизировать любое из этих чтений в локальный кеш. К сожалению, в VB.NET нет эквивалента, поэтому вам придется использовать что-то еще.

Принятый ответ на этот вопрос должен предоставить дополнительную информацию о том, что вы можете сделать. Короче говоря, большинство людей используют SyncLock в VB.NET, потому что это проще и менее сложно, чем логика, необходимая для этого без SyncLock .

4
ответ дан 4 December 2019 в 10:03
поделиться

Это потому, что об этом никто не знает. Распространить слово!

5
ответ дан 4 December 2019 в 10:03
поделиться

Interlocked ограничен простыми операциями над Integer, Long и Boolean и тому подобными.

Если вы хотите, например, добавить элемент в общий список (из T), вам все равно понадобится SynClock.

1
ответ дан 4 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: