开始多线程代码之前的初始化
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 函数调用之前、调用之后的代码。
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 函数调用之前、调用之后的代码。