Подтвердить что ты не робот

Разница между стандартным атомным bool и атомным флагом

Я не знал переменные std::atomic, но знал о std::mutex (странное право!), предоставленное стандартом; однако одно замечание привлекло мое внимание: есть два, казалось бы, одинаковых (для меня) атомных типа, предусмотренных стандартом, перечисленным ниже:

Также упоминается пример std::atomic_flag type -

std:: atomic_flag - это атомный булев тип. В отличие от всех специализаций std:: atomic, он гарантированно не блокируется. В отличие от std:: atomic, std:: atomic_flag не предоставляет операции загрузки или хранения.

который я не понимаю. Не гарантируется ли std::atomic bool type блокировка? Тогда это не атомный или что?

Итак, какая разница между двумя и когда я должен использовать, что?

4b9b3361

Ответ 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, с другой стороны, гарантируется реализация с использованием технологии блокировки.