В общем случае для int num
, num++
(или ++num
) в качестве операции чтения-изменения-записи не является атомным. Но я часто вижу компиляторы, например GCC, генерирует для него следующий код (попробуйте здесь):
Так как строка 5, соответствующая num++
, является одной инструкцией, мы можем заключить, что num++
является атомарным в этом случае?
И если да, означает ли это, что сгенерированный num++
может использоваться в параллельных (многопоточных) сценариях без какой-либо опасности рас сканов данных (т.е. нам не нужно делать это, например, std::atomic<int>
и налагать связанные затраты, так как в любом случае это атом)?
UPDATE
Обратите внимание, что этот вопрос не в том, является ли приращение атомарным (это не так, и это была и есть начальная строка вопроса). Это может быть в конкретных сценариях, то есть, может ли однонаправленный характер использоваться в определенных случаях, чтобы избежать накладных расходов префикса lock
. И поскольку в принятом ответе упоминается раздел об однопроцессорных машинах, а также этот ответ, разговор в его комментариях и других объясняет, он может (хотя и не с C или С++).