C++ atomic_flag查询状态

C++ atomic_flag query state

本文关键字:查询 状态 flag atomic C++      更新时间:2023-10-16

我正在使用C++ std::atomic_flag作为原子布尔标志。将标志设置为 true 或 false 不是问题,但是如何在不将其设置为某个值的情况下查询标志的当前状态?我知道有方法"atomic_flag_clear"和"atomic_flag_set"。它们确实会返回以前的状态,但也会修改当前状态。有没有办法在不修改标志状态的情况下查询标志状态,或者我必须使用完整的" std::atomic<bool> "。

如果不将std::atomic_flag的值设置为 true,则无法读取该值。这是设计使然。它不是一个布尔变量(我们有std::atomic<bool>),而是一个最小的标志,保证在所有支持 C++11 的架构上无锁。

在某些平台上,唯一的原子指令是交换指令。在这样的平台上,std::atomic_flag::test_and_set()可以用exchange var,1实现,clear()可以用exchange var,0来实现,但没有读取值的原子指令。

因此,如果要在不更改值的情况下读取值,则需要std::atomic<bool>.

如果要使用 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();

在 C++20 中,我们得到了 test() 方法,它完全符合 OP 的要求。