如果 bool 只从 false 变为 true 一次,我可以避免锁定它吗?
Can I avoid locking a bool if it only goes from false to true once?
我有一个被多个线程访问的 bool
,但该值只能在程序运行期间从 false
转换到 true
一次。只要值是 eventually true
,我不在乎每个线程都有一个立即一致的变量视图——只要它们最终都把它捡起来.
不幸的是,检查此值的值的调用非常频繁,因此锁定该值的代价很高。
我看过其他帖子,人们谈到缓存可能无法正确刷新,但是不锁定读取的 确切 副作用是什么?
谢谢!
确切的副作用是未定义的行为。
对于常规 bool
,编译器不知道它将在多个线程中访问,因此它可能会应用导致未定义行为的优化(例如对其他线程不可见的更新)。
将 bool
替换为 std::atomic<bool>
,完全按照您使用 bool
的方式使用它,您就可以了。无需锁定。
改为使用原子。它比任何锁都便宜,并且会以一致性解决您的问题。
另一种方式:不要多次检查你的变量。将变量更改通知每个线程。
我有一个被多个线程访问的 bool
,但该值只能在程序运行期间从 false
转换到 true
一次。只要值是 eventually true
,我不在乎每个线程都有一个立即一致的变量视图——只要它们最终都把它捡起来.
不幸的是,检查此值的值的调用非常频繁,因此锁定该值的代价很高。
我看过其他帖子,人们谈到缓存可能无法正确刷新,但是不锁定读取的 确切 副作用是什么?
谢谢!
确切的副作用是未定义的行为。
对于常规 bool
,编译器不知道它将在多个线程中访问,因此它可能会应用导致未定义行为的优化(例如对其他线程不可见的更新)。
将 bool
替换为 std::atomic<bool>
,完全按照您使用 bool
的方式使用它,您就可以了。无需锁定。
改为使用原子。它比任何锁都便宜,并且会以一致性解决您的问题。
另一种方式:不要多次检查你的变量。将变量更改通知每个线程。