布尔标志应该始终是原子的
Should a boolean flag always be atomic?
>假设有一个由主线程控制的布尔标志(keep_running)。另一个线程无限期循环,直到此标志变为假。
int main() {
bool keep_running(true);
std::thread run( [](bool &keep_running)
{
while(keep_running)
{
// do work
}
}, std::ref(keep_running) );
// do other work
keep_running = false;
run.join();
return 0;
}
那个标志应该是原子的吗?
std::atomic<bool> keep_running
我想,非原子版本可能发生的最坏情况是,在
while(keep_running)
被执行。在这种情况下,循环会继续运行一次(不是严格需要的)迭代。但就我而言,这是可以接受的。
是否存在上述代码可能出错的情况?
编辑:
出于性能原因(以及没有错误),我对此最感兴趣。因此,将 std::atomic 用于循环中的标志会对性能产生负面影响吗?
它只是 C++11 标准禁止(将它们标记为未定义行为)并发访问非原子变量。
所以你需要声明这个变量原子。
请注意,将 keep_running.load(std::memory_order_relaxed)
用于读取值,keep_running.store(true, std::memory_order_relaxed)
用于写入值将消除任何额外的性能成本,因此生成的代码将与没有原子的代码一样快。
可能会在线程中将我想,非原子版本可能发生的最坏情况是旗帜在当时被设置正确。
变量存储在寄存器中并且永远不会重新加载(因此线程永远不会停止)。如果没有atomic
或其他特殊类型和修饰符,编译器可以这样做,而且实际上确实如此。
相关文章:
- C++中原子的替代品<variant>
- 调用原子的 store() 时可以调用基类型类的函数吗?C++
- C ++是否有C ++ 17 OSX 10.13.6的标志
- 生成文件中隐式规则中的 -c 标志出错
- 为什么 C++20 不使用"requires"来限制原子的 T<T>?
- boost::asio::io_service::p ost 是原子的吗?
- 原子的矢量完全线程安全?
- 如何在 cmake 中设置编译器特定的标志
- std::包含原子的类的向量
- 初始化原子指针是原子的吗?如果初始化或内存分配引发,会发生什么情况?
- 标准::原子的锁在哪里
- 添加 swig pythoncode 以在 Python 对象上设置自己的标志
- stat() 相对于文件系统是原子的
- 试图最大程度地减少对每次迭代的原子的检查
- 原子的类内初始化
- 对 c++ 11 原子变量的操作实际上是原子的
- 如何配置 g++,以便 x++ 是原子的(Ubuntu,openmp)
- 原子compare_exchange,但基于正在设置的标志,而不是相等
- 可以确保同步的原子bool标志
- 布尔标志应该始终是原子的