我使用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,1
和clear()
与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