C++ atomic_flag查询状态
C++ atomic_flag query state
我正在使用C++ std::atomic_flag
作为原子布尔标志。将标志设置为 true 或 false 不是问题,但是如何在不将其设置为某个值的情况下查询标志的当前状态?我知道有方法"atomic_flag_clear
"和"atomic_flag_set
"。它们确实会返回以前的状态,但也会修改当前状态。有没有办法在不修改标志状态的情况下查询标志状态,或者我必须使用完整的" std::atomic<bool>
"。
如果不将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>
.
如果要使用 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++20 中,我们得到了 test()
方法,它完全符合 OP 的要求。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 查询SQLite数据库中的日期
- 如何在ArangoDb AQL查询中指定数据库
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- Qt SQLite没有查询或参数计数不匹配
- 如何使用c++在VS 2019上运行SQL查询
- std::future_error:无关联状态
- 从返回的顶点缓冲区查询顶点结构
- 如何避免LED在循环状态变化中闪烁?
- 以非特权用户身份查询 NTFS 特殊文件的元数据?
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- boost 是否有按特殊类型值编码状态"compact optional"?
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 重新设置了以前的状态3查询
- C++ atomic_flag查询状态
- 无法删除 QSql数据库 - 查询仍处于活动状态
- Windows:如何在低级键盘挂钩中查询修饰键的状态