Безопасны ли инкременты / декременты (var ++, var--) и т. Д.? - PullRequest
15 голосов
/ 14 января 2009

Вдохновленный этим вопросом: В Анализе сложности почему ++ считается 2 операциями?

Возьмите следующий код псевдо:

class test
{
   int _counter;
   void Increment()
   {
     _counter++;
   } 
}

Можно ли считать это потокобезопасным в архитектуре x86? Более того, безопасны ли инструкции по сборке Inc / Dec?

Ответы [ 2 ]

30 голосов
/ 14 января 2009

Нет, приращение не является потокобезопасным. Также нет инструкций INC и DEC. Все они требуют загрузки и сохранения, а поток, работающий на другом процессоре, может выполнять свою собственную загрузку или сохранять в том же месте памяти, чередующемся между этими операциями.

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

13 голосов
/ 14 января 2009

Одним словом, нет.

Вы можете использовать что-то вроде InterlockedIncrement() в зависимости от вашей платформы. В .NET вы можете использовать методы класса Interlocked (например, Interlocked.Increment()).

A Роб Кеннеди упомянул , даже если операция реализована в виде одной инструкции INC, что касается памяти, выполняется набор шагов чтения / увеличения / записи. Существует возможность на многопроцессорной системе для коррупции.

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

Это верно в целом, и на платформах x86 / x64, безусловно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...