Я использую С++ std::atomic_flag
как атомный булевский флаг. Установка флага в true или false не является проблемой, но как запросить текущее состояние флага, не устанавливая его на какое-то значение? Я знаю, что существуют методы "atomic_flag_clear
" и "atomic_flag_set
". Они возвращают предыдущее состояние, но также изменяют текущее состояние. Есть ли способ запросить состояние флага без его модификации или мне нужно использовать полноценный 'std::atomic<bool>
'.
Состояние запроса atom_flag в С++
Ответ 1
Вы не можете прочитать значение std::atomic_flag
, не устанавливая его на true
. Это по дизайну. Это не логическая переменная (для этого мы имеем std::atomic<bool>
), но минимальный флаг, который гарантированно блокируется во всех архитектурах, поддерживающих С++ 11.
На некоторых платформах единственными командами атома являются команды обмена. На таких платформах std::atomic_flag::test_and_set()
может быть реализовано с помощью exchange var,1
и clear()
с помощью exchange var,0
, но для чтения значения не существует атомной инструкции.
Итак, если вы хотите прочитать значение без его изменения, вам понадобится std::atomic<bool>
.
Ответ 2
Если вы хотите использовать atomic_flag
, чтобы определить, должен ли поток выйти, вы можете сделать это следующим образом:
Инициализация:
std::atomic_flag keep_running = ATOMIC_FLAG_INIT;
keep_running.test_and_set();
Цикл потока:
while (keep_running.test_and_set()) {
// do thread stuff
}
Если вы хотите, чтобы поток вышел:
keep_running.clear();