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

Состояние запроса atom_flag в С++

Я использую С++ std::atomic_flag как атомный булевский флаг. Установка флага в true или false не является проблемой, но как запросить текущее состояние флага, не устанавливая его на какое-то значение? Я знаю, что существуют методы "atomic_flag_clear" и "atomic_flag_set". Они возвращают предыдущее состояние, но также изменяют текущее состояние. Есть ли способ запросить состояние флага без его модификации или мне нужно использовать полноценный 'std::atomic<bool>'.

4b9b3361

Ответ 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();