Я делал простую многопоточность в 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
методы?
Вы правы; Здесь следует использовать Interlocked
, он будет быстрее, чем SyncLock
.
Однако класс Interlocked
малоизвестен.
Однако бывают ситуации, когда вам нужно использовать SyncLock
и Interlocked
не поможет.
Короткий ответ: используется блокировка Monitor
( SyncLock
в VB и блокировка {}
в C #) не только гарантирует, что только один поток одновременно может получить доступ к переменной (или, строго говоря, только один поток за раз может получить блокировку для объекта блокировки), но также создает память барьер, необходимый для гарантии того, что чтение переменной не будет оптимизировано.
Если вы никогда не просто читаете значение переменной (другими словами, вся ваша работа выполняется через вызовы Interlocked
), тогда все будет в порядке. Однако, если вам нужно иметь возможность выполнить обычное чтение переменной, ситуация более сложная.Чтение / запись без блокировки обычно выполняются в C # с использованием ключевого слова volatile
. Это инструктирует компилятор читать значение переменной везде, где оно используется, вместо того, чтобы оптимизировать любое из этих чтений в локальный кеш. К сожалению, в VB.NET нет эквивалента, поэтому вам придется использовать что-то еще.
Принятый ответ на этот вопрос должен предоставить дополнительную информацию о том, что вы можете сделать. Короче говоря, большинство людей используют SyncLock
в VB.NET, потому что это проще и менее сложно, чем логика, необходимая для этого без SyncLock
.
Это потому, что об этом никто не знает. Распространить слово!
Interlocked
ограничен простыми операциями над Integer, Long и Boolean и тому подобными.
Если вы хотите, например, добавить элемент в общий список (из T), вам все равно понадобится SynClock
.