开始多线程代码之前的初始化

Initialization before we start a multithreading code

本文关键字:初始化 多线程 代码 开始      更新时间:2023-10-16
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函数的代码,那么它应该在函数内部找到内存屏障(或任何导致这种效果的操作(。(任何线程启动函数内部都应该有一个内存屏障;这应该在其协定/描述中说明(。同样,编译器不能绕过此障碍移动(至少向前移动(任何代码。

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