C ++ atomic_flag查询状态

时间:2012-06-19 11:01:35

标签: c++ multithreading c++11 atomic

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

3 个答案:

答案 0 :(得分:47)

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

在某些平台上,唯一的原子指令是交换指令。在此类平台上,exchange var,1可以使用clear()exchange var,0实现std::atomic<bool>,但是没有用于读取值的原子指令。

因此,如果您想在不更改值的情况下阅读该值,则需要{{1}}。

答案 1 :(得分:13)

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

答案 2 :(得分:0)

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