在我们启动多线程代码之前进行初始化

问题描述 投票:0回答:1
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是什么意思。所以,它必须真的超级超级聪明。但是,我们可以假设它不是吗?

你怎么看?

c++ x86 memory-barriers
1个回答
1
投票

如果编译器没有看到startMultitreadingServer函数的代码,则禁止(通过语言规范)围绕函数的调用移动任何代码。

如果编译器看到startMultitreadingServer函数的代码,那么它应该在函数内部找到一个内存屏障(或导致这种效果的任何操作)。 (任何线程启动函数都应该在内部有一个内存屏障;这应该在其合同/描述中说明)。而且,编译器无法移动(至少,转发)围绕此障碍的任何代码。

因此,在任何情况下,编译器都无法在该调用之后在线程创建函数调用之前移动代码。

© www.soinside.com 2019 - 2024. All rights reserved.