2016-09-05 2 views
29

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

  1. std::atomic<bool> типа

  2. std::atomic_flag типа

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

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

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

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

+2

«Atomic» и «lock-free» не являются синонимами. Вы можете легко блокироваться, не будучи атомарным (это происходит, когда вы не выполняете синхронизацию, например: P), и вы можете легко получить атомную операцию, которая не является блокировкой (например, используя монитор). – Luaan

ответ

21

std :: атомный тип bool не гарантируется, чтобы быть заблокированным?

Исправить. std::atomic могут быть реализованы с использованием замков.

то это не атомный или что?

std::atomic является атомарным, было ли оно реализовано с использованием замков или без него. std::atomic_flag гарантированно будет реализован без использования замков.

Так что разница в ч/б два

Основного различия кроме безблокировочной гарантии:

std::atomic_flag не обеспечивает загрузку или хранение операций.


и когда я должен использовать какой?

Обычно вам нужно использовать std::atomic<bool>, когда вам нужна атомная булева переменная. std::atomic_flag - структура низкого уровня, которая может использоваться для реализации пользовательских атомных структур.

+2

Если целевая архитектура поддерживает атомные операции, не было бы причин использовать блокировки. Но если это не так, я задаюсь вопросом: «Как бы« было бы »std :: atomic_flag? – rustyx

+0

[для редактирования] да, потому что загрузка и хранение могут не иметь отношения к логическому 'std :: atomic', но будут с другими типами. –

+6

@RustyX: все существующие архитектуры поддерживают, по меньшей мере, атомную нагрузку и заданное слово (или эквивалентное отрицательное значение load-and-clear-word), чего достаточно для реализации 'std :: atomic_flag', но не намного больше. См. PA-RISC, где 'ldcw' - единственный атомный RMW op. – Fanael

18

std::atomic<T> гарантирует, что доступ к переменной будет атомарным. Однако он не говорит, как достигается атомарность. Он может использовать переменную блокировки или использовать блокировку. Фактическая реализация зависит от вашей целевой архитектуры и типа T.

std::atomic_flag, с другой стороны, гарантированно реализуется с использованием технологии блокировки.