InterlockedIncrement vs. ++ - PullRequest
       23

InterlockedIncrement vs. ++

1 голос
/ 19 сентября 2009

Как работает InterlockedIncrement?

Это касается только многопроцессорных систем?

Что он делает, отключать прерывания на всех процессорах?

Ответы [ 3 ]

4 голосов
/ 19 сентября 2009

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

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

Я не верю, что инструкция отключает прерывания, по крайней мере, на оборудовании типа x86.

2 голосов
/ 19 сентября 2009

jcopenha верна, но я просто хотел ответить на вопрос: «Беспокойство касается только многопроцессорных систем?»

Я не знаю, какой Interlocked вы используете. Если вы имеете в виду c ++, то на одноядерном вы «должны быть» безопасны для выполнения «++ x», если x не больше вашей «битности». Я пишу «должно быть», потому что компилятор может оптимизировать его каким-то странным образом в функции - например, заменить два «++ x» на обычные «add ..., 2» в совершенно другом месте и часть вашей многопоточности логика может потерпеть неудачу из-за этого. На многоядерном языке даже ++ x на 32-битном x может иметь странные эффекты (инструкция может быть «inc mem» или «lock inc mem»), и когда вы увеличиваете один адрес mem из двух процессоров, когда он не заблокирован, вы получить странные результаты).

Если «битность» вашего x выше, чем у вашего процессора, тогда вам необходимо блокировать любой многопоточный код - не имеет значения, одно- или многоядерный, потому что эта инструкция в любом случае должна быть скомпилирована в два asm-кода и переключение контекста может произойти между ними. (это можно исправить с помощью RCU)

В .NET это в основном та же история, но вы перегрузили Increment вместо Interlocked ... и Interlocked ... 64.

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

0 голосов
/ 06 февраля 2019

InterlockIncrement - определенно путь, если вас беспокоит производительность: InterlockIncrement увеличивает указанную переменную и сохраняет результат, поскольку атомарная операция (MSDN), передающая переменную, передается по ссылке (Interlocked.Increment (ref increment)) , В ++ значение передается по адресу, вызывая возврат в память при каждом вызове инструкции.

...