【发布时间】:2022-08-10 13:42:14
【问题描述】:
volatile bool b;
Thread1: //only reads b
void f1() {
while (1) {
if (b) {do something};
else { do something else};
}
}
Thread2:
//only sets b to true if certain condition met
// updated by thread2
void f2() {
while (1) {
//some local condition evaluated - local_cond
if (!b && (local_cond == true)) b = true;
//some other work
}
}
Thread3:
//only sets b to false when it gets a message on a socket its listening to
void f3() {
while (1) {
//select socket
if (expected message came) b = false;
//do some other work
}
}
如果线程 2 首先在时间 t 更新 b,然后线程 3 在时间 t+5 更新 b:
thread1 在读取 b 时会看到“及时”的最新值吗?
例如:从 t+delta 到 t+5+delta 的读取应该是 true 并且 在 t+5+delta 之后读取应该是假的。
delta 是线程 2 或 3 之一更新它时将“b”存储到内存中的时间
-
volatile不用于线程。 -
@YouliLuo:没有人谈论关键部分。 C/C++
volatile也不适用于无锁代码;这就是 C++std::atomic的用途。 When to use volatile with multi threading? - 基本上从不使用std::atomic<int>和std::memory_order_release或relaxed,如果那是你想要的。 -
一个核心上的存储不会立即对其他核心可见;在它们执行之后,在它实际提交到 L1d 缓存之前会有一些延迟。如果
t+5晚了 5 个时钟或纳秒,那么线程间延迟在您的时间尺度上很重要。但如果它是 5 秒,那么可以肯定的是,不稳定的能见度足够接近瞬时。请参阅Is a memory barrier required to read a value that is atomically modified? 的“最新值”部分 -
简短的回答是“不”。您正在寻求的行为需要在访问共同变量或操作原子性的线程之间进行一些同步元素,
volatile两者都不支持。volatile所做的只是告诉编译器一个变量可能会以某种编译器不可见的方式被修改——通常这会影响优化/重新排序代码和指令的能力。如果它们抢占正在更改该变量值的线程,则不能确保(例如)读取变量的线程接收有意义的值之类的事情。 -
如果
a仅在 f2 中使用,为什么它在结构中。
标签: c++ multithreading x86-64 volatile lock-free