C ++ 0x paper N2427 (атомика) гласит примерно следующее. Я немного изменил формулировку, чтобы ее было легче читать для конкретной ситуации декремента, части, которые я изменил, выделены жирным шрифтом :
Эффекты:
Атомно заменить значение в объект результатом декремента , примененного к значению в объект и данным операнд. Память влияет на порядок. Эти операции являются операциями чтения-изменения-записи в смысле определения «синхронизируется с» в [новом разделе, добавленном N2334 или преемником], и, следовательно, и такая операция, и оценка, которая произвела входное значение, синхронизируются с любой оценкой, которая читает обновленное значение.
Возвращает:
Атомно, значение объекта непосредственно перед декрементом .
Атомная операция гарантирует, что оператор декремента вернет значение, которое переменная содержала непосредственно перед операцией, это атомарное, поэтому не может быть промежуточного значения из обновлений другим потоком.
Это означает, что единственные возможные варианты выполнения этого кода с двумя потоками:
(Initial Value: 1)
Thread 1: Decrement
Thread 1: Compare, value is 0, enter region of interest
Thread 2: Decrement
Thread 2: Compare, value is -1, don't enter region
или
(Initial Value: 1)
Thread 1: Decrement
Thread 2: Decrement
Thread 1: Compare, value is 0, enter region of interest
Thread 2: Compare, value is -1, don't enter region
Случай 1 - неинтересный ожидаемый случай.
Случай 2 перемежает операции декремента и выполняет операции сравнения позже. Поскольку операция декремента и выборки atomic , поток 1 не может получить значение, отличное от 0, для сравнения. не может получить -1, потому что операция была атомарной ... чтение происходит во время декремента, а не во время сравнения. Другие темы не изменят это поведение.