我使用 C++std::atomic_flag
作为原子布尔标志。将标志设置为真或假不是问题,但是如何在不将其设置为某个值的情况下查询标志的当前状态?我知道有方法' atomic_flag_clear
'和' atomic_flag_set
'。它们确实会返回以前的状态,但也会修改当前状态。有没有办法在不修改它的情况下查询标志状态,或者我必须使用完整的“ std::atomic<bool>
”。
问问题
10576 次
3 回答
52
std::atomic_flag
如果不将其设置为 ,则无法读取 a 的值true
。这是设计使然。它不是一个布尔变量(我们有std::atomic<bool>
这个),而是一个最小的标志,保证在所有支持 C++11 的架构上无锁。
在某些平台上,唯一的原子指令是交换指令。在这样的平台上,std::atomic_flag::test_and_set()
可以使用exchange var,1
和clear()
with来实现exchange var,0
,但是没有用于读取值的原子指令。
所以,如果你想读取值而不改变它,那么你需要std::atomic<bool>
.
于 2012-06-19T15:31:34.150 回答
22
如果你想用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();
于 2015-03-26T19:47:25.717 回答
2
使用 C++20,我们得到了test()
方法,这正是 OP 想要的。
于 2021-02-17T16:32:58.703 回答