Сравнивая std::atomic_flag
с std::atomic_bool
(он же std::atomic<bool>
), мне кажется, что std::atomic_flag
просто имеет более простой интерфейс. Он обеспечивает только проверку + установку и очистку флага, в то время как std::atomic_bool
также обеспечивает перегрузки для нескольких операторов.
Один мой вопрос касается терминологии: что подразумевается под «операциями загрузки или хранения»? Означает ли это, что невозможно произвольно прочитать и изменить значение std::atomic_flag
?
Кроме того, мне интересно, может ли std::atomic_bool
быть быстрее при использовании для спин-блокировки? Мне кажется, что std::atomic_flag
всегда должен читать и писать во время спин-блокировки:
while (my_atomic_flag.test_and_set()); // spin-lock
, в то время как std::atomic_bool
должен был бы только выполнить операцию чтения (при условии, что атомарный тип bool реализован без блокировки):
while (my_atomic_bool); // spin-lock
Является ли std::atomic_flag
строго более эффективным, чем std::atomic_bool
, или он может быть и наоборот? Что следует использовать для спин-блокировки?