C++ 如果bool只从false变为true一次,我可以避免锁定它吗?
我有一个被多个线程访问的C++ 如果bool只从false变为true一次,我可以避免锁定它吗?,c++,boolean,atomic,C++,Boolean,Atomic,我有一个被多个线程访问的bool,但该值只能在程序运行期间从false转换为true。只要值最终为true,我不在乎每个线程对变量都有一个立即一致的视图——只要它们最终都选择了它 不幸的是,经常调用检查此值的值,因此锁定该值的代价很高 我看过其他帖子,其中有人谈到缓存可能无法正确刷新,但不锁定读取的确切的副作用是什么 谢谢 确切的副作用是未定义的行为。 对于常规的bool,编译器不知道它将在多个线程中被访问,因此它可能会应用导致未定义行为的优化(例如其他线程看不到的更新) 将bool替换为std
bool
,但该值只能在程序运行期间从false
转换为true
。只要值最终为true
,我不在乎每个线程对变量都有一个立即一致的视图——只要它们最终都选择了它
不幸的是,经常调用检查此值的值,因此锁定该值的代价很高
我看过其他帖子,其中有人谈到缓存可能无法正确刷新,但不锁定读取的确切的副作用是什么
谢谢 确切的副作用是未定义的行为。
对于常规的
bool
,编译器不知道它将在多个线程中被访问,因此它可能会应用导致未定义行为的优化(例如其他线程看不到的更新)
将
bool
替换为std::atomic
,像使用bool
一样使用它,您就没事了。无需锁定。使用原子。它比任何锁都便宜,并且会以一致性解决您的问题
另一种方法:不要多次检查变量。将变量更改通知每个线程。要学究化,程序可能永远看不到布尔更改状态。@FrançoisAndrieux是的,但
volatile
与线程无关。volatile
不足以进行线程同步。在访问它的所有线程中对布尔值使用volatile
就足够了编译器不会将布尔值放入寄存器中。将保证所有线程和/或内核和/或处理器都能看到任何更新。对volatile的所有读/写操作都是有序的,但如果读/写操作是非volatile和volatile的混合,编译器和/或处理器可能会重新排序,这将是线程安全的。对于并发访问共享变量,使用volatile
既不必要,也不充分。有可移植的标准替代品,没有volatile
的缺点。这里没有地方。没有一个std::atomic
的文档表明不保证无锁(是无锁的
功能)。是否有编译器特定的无锁类型列表?@Redmumba检查ATOMIC\u BOOL\u lock\u free
宏,以及其他内置类型的类似宏(或在C++17中使用constexprstd::ATOMIC::Is\u always\u lock\u free
常量)。