Атомарность операций вызвана аппаратными средствами, а не программными (ну, в C ++ есть также «атомарные» переменные, которые являются только атомарными по имени, которые реализуются через мьютексы и блокировки).Итак, в основном атомы C ++ и атомы C делают одно и то же.Следовательно, пока типы совместимы, проблем не будет.А атомарные классы C ++ 11 и C11 были созданы для совместимости.
Очевидно, что люди не понимают, как работают атомные блоки и блокировки, и требуют дальнейшего объяснения.Проверьте текущие модели памяти для получения дополнительной информации.
1) Мы начнем с основ.Что и почему атомы?Как работает память?
Модель памяти: воспринимайте процессор как несколько независимых ядер, каждое из которых имеет собственную память (обналичивает L1, L2 и L3; фактически, наличные L3 распространены, но на самом деле это не такважно).
Зачем нам нужна атомарная операция?
Если вы не используете атомики, тогда у каждого процессора может быть своя собственная версия переменной 'x', и они, как правило, не синхронизируются.Пока неизвестно, когда они будут выполнять синхронизацию с наличными в ОЗУ / L3.
Когда используются атомарные операции, используются такие операции с памятью, которые обеспечивают синхронизацию с наличными в ОЗУ / L3 (или с чем угодно), обеспечиваяядра имеют доступ к одной и той же переменной и не имеют различных ее версий.
Никому не важно, какой это язык: C, C ++ или любой другой, который вы используете - если только вы обеспечиваете синхронизацию памяти (и чтение, и записьи измените) проблем никогда не будет.
2) Хорошо, а как насчет блокировок и мьютексов?
Мьютексы обычно работают с ОС и имеют очередь, в которой поток должен быть разрешен рядом свыполнять.И они обеспечивают более строгую синхронизацию памяти, чем атомные.С помощью atomics можно синхронизировать только саму переменную или более в зависимости от запроса / какую функцию вы вызываете.
3) Скажем, у меня есть atomic_bool, может ли она работать взаимозаменяемо на разных языках (C / C ++ 11)?
Обычно логическое значение может быть синхронизировано с помощью операций с памятью (вы просто синхронизируете один байт памяти с их точки зрения).Если компиляторы знают, что аппаратные средства могут выполнять такие операции, они наверняка будут использовать их, пока вы используете стандарт.
Логическая атомика (любой std :: atomic с T, имеющим неправильный размер / выравнивание) синхронизируются через замки.В этом случае маловероятно, что разные языки могут использовать их взаимозаменяемо - если у них разные способы использования этих блокировок или по какой-то причине один решил использовать блокировку, а другой пришел к выводу, что он может работать с атомарной аппаратной памятьюсинхронизации ... тогда будут проблемы.
Если вы используете atomic_bool на любом современном компьютере с C / C ++, он наверняка сможет синхронизироваться без блокировок.