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