Подтвердить что ты не робот

Что такое блокировка. Фактически?

Interlocked.Increment кажется одним из самых стандартных/простых операций, которые нужно выполнить в многопоточном коде.

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

Итак, в основном, мне интересно, может ли кто-то предоставить точный дубликат (с объяснением того, как он работает) того, что метод Interlocked.Increment действительно делает внутренне? (Я искал источник фактического метода, но не смог его найти)

4b9b3361

Ответ 1

По словам г-на Albahari, он выполняет две функции:

  • делает атомарность операции известной для ОС и VM, так что, например, операции с 64-битными значениями в 32-битной системе будут атомарными
  • генерирует full fence ограничение переупорядочения и кеширования блокированных vars

Посмотрите на эту ссылку - она ​​дает несколько приятных примеров.

Ответ 2

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

private static int Value = 42;
public static void Foo() {
   Interlocked.Increment(ref Value);
}

В x86 он генерирует следующее

lock inc dword <LOCATION>

Модификатор lock блокирует шину, чтобы предотвратить одновременное обновление нескольких ЦП.

На x64 он генерирует

lock xadd dword ptr <LOCATION>,eax

Ответ 3

Я ожидаю, что это будет оболочка для вызова InterlockedIncrement64 Win32.


EDIT: Я вижу, что это был очень короткий ответ. Немного поработать: легко воспроизвести функциональность функции, но не производительность. В большинстве процессоров есть собственные инструкции, которые предоставляют вам инструкцию атомарного обмена и добавления, поэтому вы хотите, чтобы эта инструкция использовалась для реализации вашей функции, и я ожидаю, что самый простой способ добиться этого из С# будет состоять в том, чтобы сделать вызов API win32. Для получения дополнительной информации по этому вопросу просмотрите этот технический документ.