Вопрос

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

Речь идет только о многопроцессорных системах?

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top