线程,如果else语句,都是错误的上下文切换后,会发生什么



示例

int a = 8;
if(a < 9){
something1();
}
else{
something2();
}

如果在if语句之前(在a的初始化之后(有一个上下文切换,它将把a变为a=11,然后返回到上面的代码,在转到else之前,另一个上下文切换将把a改为a=8,然后再次返回到上面代码。它还会在其他状态吗?

感谢

如果a可以由其他线程修改,那么代码必须以某种方式同步这两个线程。最简单的方法,在这里似乎是合适的,是使a原子化:

std::atomic<int> a = 8;

现在,多个线程可以通过定义良好的行为读取和写入a的值。当然,你看到的实际值取决于读写的顺序,而语言定义对你没有帮助。但是,使a成为原子可以确保每次读取都会看到实际写入的值,并且编译器不会优化if语句中的测试。

if语句通常在汇编代码中使用条件跳转来实现。但它们不一定是。例如,以以下代码为例:

int main(int argc, char** argv) {
if (argc > 42)
return 62;
else
return 31;
}

clang编译为(经过优化(:

main: # @main
cmp edi, 42
mov ecx, 62
mov eax, 31
cmovg eax, ecx
ret

无论如何,你通常会在某个地方进行一次比较,即变量只检查一次。在这种情况下,在cmp edi, 42语句中检查变量。

一般来说,这种行为是不明确的。

最新更新