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的含义。因此,它必须真正超级智能。 但是,我们可以假设不是吗?
你怎么看?
答案 0 :(得分:1)
如果编译器看不到startMultitreadingServer
函数的代码,则(根据语言规范)禁止在函数调用周围移动任何代码。
如果编译器参见startMultitreadingServer
函数的代码,则它应该在函数内部找到内存障碍(或引起该效果的任何操作) 。 (任何 thread-starting 函数内部都应具有内存屏障;应在其合同/说明中说明)。同样,编译器无法绕过此障碍移动(至少,向前)任何代码。
因此,在任何情况下,编译器都无法在该调用之后的 thread-creation 函数调用之前移动代码。