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
函数的代码,那么它应该在函数内部找到一个内存屏障(或导致这种效果的任何操作)。 (任何线程启动函数都应该在内部有一个内存屏障;这应该在其合同/描述中说明)。而且,编译器无法移动(至少,转发)围绕此障碍的任何代码。
因此,在任何情况下,编译器都无法在该调用之后在线程创建函数调用之前移动代码。