36

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

4

3 回答 3

52

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

在某些平台上,唯一的原子指令是交换指令。在这样的平台上,std::atomic_flag::test_and_set()可以使用exchange var,1clear()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 回答