Что такое блокировка. Фактически?
Interlocked.Increment
кажется одним из самых стандартных/простых операций, которые нужно выполнить в многопоточном коде.
Я предполагаю, что функциональность метода - это своего рода шаблон, который сможет воспроизвести любой, кто имеет опыт потоковой передачи.
Итак, в основном, мне интересно, может ли кто-то предоставить точный дубликат (с объяснением того, как он работает) того, что метод Interlocked.Increment
действительно делает внутренне? (Я искал источник фактического метода, но не смог его найти)
Ответы
Ответ 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. Для получения дополнительной информации по этому вопросу просмотрите этот технический документ.