开始多线程代码之前的初始化

Initialization before we start a multithreading code

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 是什么意思。因此,它必须非常超级超级聪明。 但是,我们可以假设它不是吗?

你怎么看?

如果编译器看不到startMultitreadingServer函数的代码,那么(根据语言规范)禁止在调用函数。

如果编译器看到startMultitreadingServer函数的代码,那么它应该找到内存屏障(或任何操作导致这种效果)在函数内部。 (任何 thread-starting 函数都应该在内部有一个内存屏障;这应该在它的 contract/description 中说明)。同样,编译器不能移动(至少,向前)绕过这个障碍的任何代码。

因此,在任何情况下,编译器都无法移动 thread-creation 函数调用之前、调用之后的代码。