C ++ atomic_flag查询状态(C++ atomic_flag query state)

2019-06-25 14:36发布

我使用C ++ std::atomic_flag作为一个原子布尔标志。 该标志设置为true或false是没有问题的,但是如何查询标志的当前状态,而不将其设置为某个值? 我知道有方法“ atomic_flag_clear ”和“ atomic_flag_set ”。 他们还给以前的状态,但也修改当前的状态。 有没有什么办法来查询标志的状态,而无需修改,或做我必须使用羽翼丰满“ std::atomic<bool> ”。

Answer 1:

你不能读取的值std::atomic_flag没有将其设置为true 。 这是由设计。 它不是一个布尔变量(我们std::atomic<bool>为该),但是这是保证一个最小的标记锁定自由在支持C ++ 11的所有体系结构。

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

所以,如果你想在不改变它来阅读的价值,那么你需要std::atomic<bool>



Answer 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();


文章来源: C++ atomic_flag query state