在开始多线程代码之前进行初始化

时间:2018-08-30 07:51:03

标签: c++ x86 memory-barriers

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 个答案:

答案 0 :(得分:1)

如果编译器看不到startMultitreadingServer函数的代码,则(根据语言规范)禁止在函数调用周围移动任何代码。

如果编译器参见startMultitreadingServer函数的代码,则它应该在函数内部找到内存障碍(或引起该效果的任何操作) 。 (任何 thread-starting 函数内部都应具有内存屏障;应在其合同/说明中说明)。同样,编译器无法绕过此障碍移动(至少,向前)任何代码。

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