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中使用constexpr
std::ATOMIC::Is\u always\u lock\u free
常量)。