提问人:user22155685 提问时间:10/25/2023 最后编辑:user22155685 更新时间:10/25/2023 访问量:69
编译器如何处理 IF 语句的优化
how does compiler handle optimizations for IF statement
问:
我正在读一本书,描述了为什么需要它Volatile
class ThreadsSharingData {
private Int32 m_flag = 0;
private Int32 m_value = 0;
// This method is executed by one thread
public void Thread1() {
// Note: These could execute in reverse order
m_value = 5;
m_flag = 1;
}
// This method is executed by another thread
public void Thread2() {
// Note: m_value could be read before m_flag
if (m_flag == 1)
Console.WriteLine(m_value);
}
}
我明白使用会禁用编译器优化,例如重新排序,书中说:Volatile
但是,即使 Thread1 方法按程序顺序(编写方式)执行,Thread2 方法仍可能显示 0。在 Thread2 方法中编译代码时,编译器必须生成代码以将 RAM 中的 m_flag 和m_value读取到 CPU 寄存器中。RAM 可能会首先提供 m_value 的值,其中包含 0。然后可以执行 Thread1 方法,将 m_value 更改为 5,将 m_flag 更改为 1。但是 Thread2 的 CPU 寄存器没有看到 m_value 已被另一个线程更改为 5,然后可以将 m_flag 中的值从 RAM 读取到 CPU 寄存器中,并且 m_flag 的值现在变为 1,导致 Thread2 再次显示 0。
我不明白为什么“RAM可以首先提供m_value的价值”。如果不是 1,那么就不需要将值加载到 ,所以应该先由 RAM 传递,这是正确的逻辑,不是吗?m_flag
m_value
m_flag
而且描述听起来像是,无论值是多少,都必须读取以防万一是'1,这听起来效率不高,因为从RAM读取值并将值保存到寄存器中可能很昂贵,那么为什么编译器会生成汇编代码,这可能会产生不必要的读取呢?或者提前进行不必要的读取有什么好处?m_flag
m_value
m_flag
答: 暂无答案
评论
if
m_flag
m_value
m_flag