При написании кроссплатформенного C ++ у вас есть только атомарное поведение при использовании std::atomic<>
.
Это правда, что на некоторых платформах, таких как Intel 64bit, процессор гарантирует, что inc
является атомарным.Однако, пожалуйста, не пишите код, который зависит от этого!Как ваш будущий отладчик, я хотел бы знать, какие данные предназначены для совместного использования в потоках, а какие нет.
Использование std::atomic<int>
может быть немного труднее написать, однако это гарантирует, что все ведет себя атомарно (на каждой платформе), либо отступая от требований к платформе ( std :: atomic:: is_lock_free ) или путем явной блокировки доступа.Он также вставляет защитные устройства, чтобы убедиться, что кэши других процессорных ядер признаны недействительными (если платформа требует этого).
На практике для Intel 64bit это должно дать вам ту же сборку, если нет, зарегистрируйте ошибку на своем компиляторе.
В то же время некоторые операции с целыми числами могут быть не атомарными (оператор * =), std::atomic
просто не содержит этих операций, что требует правильной работы с ними.тех.
На заметку: ++x
и x = x+1
- это разные операции, они могут быть оптимизированы для одной и той же сборки.Учитывая неатомарные требования к платформе, второй неожиданно становится ошибка, на решение которой уходят дни.