代码之家  ›  专栏  ›  技术社区  ›  Gilgamesz

在启动多线程代码之前初始化

  •  0
  • Gilgamesz  · 技术社区  · 6 年前
    int main(){
        // X is a shared resource
        initSharedResourceX();
        startMultitreadingServer(); // handle requests concurrently with function handle() <- below. All handlers (run concurrently) access to X **read-only**.
    
    
    }
    
    int handle(){
        return X.get(); // get() is read-only
    }
    

    我想通过在开始之前初始化一个共享资源来避免对X的同步访问。我需要编译器吗?我可以想象编译器会做如下事情:

    int main(){
        startMultitreadingServer(); 
    }
    
    int handle(){
        if(X is not initialized) {
            initSharedResourceX();
        }
        return X.get(); 
    }
    

    我知道,编译器一定非常聪明。特别是,编译器必须知道初始化X意味着什么,所以,它必须非常聪明。 但是,我们能假设不是吗?

    你怎么认为?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Tsyvarev    6 年前

    看不到代码 属于 startMultitreadingServer 函数,则禁止(由语言规范)在函数的调用周围移动任何代码。

    如果编译器 看到代码了吗 启动多线程服务器 函数,则应该找到 记忆障碍 (或引起此效果的任何操作)在函数内部。(任何 线程启动 函数内部应该有一个内存屏障;这应该在其合同/描述中说明)。同样,编译器不能(至少,向前)移动任何代码绕过这个障碍。

    因此,在任何情况下,编译器都不能将代码移动到 线程创建