Что на самом деле делает Interlocked.Increment? - PullRequest
18 голосов
/ 18 апреля 2011

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

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

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

Ответы [ 3 ]

13 голосов
/ 18 апреля 2011

Согласно мистеру Албахари он делает две вещи:

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

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

9 голосов
/ 18 апреля 2011

Я предполагаю, что это деталь реализации, но один из способов посмотреть на это - проверить скомпилированный код 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
1 голос
/ 18 апреля 2011

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


РЕДАКТИРОВАТЬ: я вижу, что это был очень короткий ответ.Основываясь на этом немного: легко воспроизвести функциональность функции, но не производительность.В большинстве процессоров есть встроенные инструкции, которые предоставляют вам элементарную инструкцию «Interlocked exchange and add», поэтому вы хотите, чтобы эта инструкция использовалась для реализации вашей функции, и я ожидаю, что самый простой способ добиться этого из C # - этосделать вызов Win32 API.Для получения дополнительной информации по этому вопросу, посмотрите этот документ .

...