Разница между стандартным атомным bool и атомным флагом
Я не знал переменные std::atomic
, но знал о std::mutex
(странное право!), предоставленное стандартом; однако одно замечание привлекло мое внимание: есть два, казалось бы, одинаковых (для меня) атомных типа, предусмотренных стандартом, перечисленным ниже:
Также упоминается пример std::atomic_flag type
-
std:: atomic_flag - это атомный булев тип. В отличие от всех специализаций std:: atomic, он гарантированно не блокируется. В отличие от std:: atomic, std:: atomic_flag не предоставляет операции загрузки или хранения.
который я не понимаю. Не гарантируется ли std::atomic bool type
блокировка? Тогда это не атомный или что?
Итак, какая разница между двумя и когда я должен использовать, что?
Ответы
Ответ 1
std:: атомный тип bool не защищен от блокировки?
Правильно. std::atomic
может быть реализован с помощью блокировок.
то это не атомно или что?
std::atomic
является атомарным, было ли реализовано с помощью блокировок или без. std::atomic_flag
гарантированно реализуется без использования блокировок.
Итак, какая разница b/w two
Основное отличие, помимо гарантии блокировки:
std::atomic_flag
не предоставляет операции загрузки или хранения.
и когда я должен использовать какой?
Обычно вам нужно использовать std::atomic<bool>
, когда вам нужна атомная логическая переменная. std::atomic_flag
- структура низкого уровня, которая может использоваться для реализации пользовательских атомных структур.
Ответ 2
std::atomic<T>
гарантирует, что доступ к переменной будет атомарным. Однако он не говорит, как достигается атомарность. Он может использовать переменную блокировки или использовать блокировку. Фактическая реализация зависит от вашей целевой архитектуры и типа T
.
std::atomic_flag
, с другой стороны, гарантируется реализация с использованием технологии блокировки.