gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:33:51 25 4
gpt4 key购买 nike

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 是什么意思。因此,它必须非常 super super 聪明。但是,我们可以假设它不是吗?

你怎么看?

最佳答案

如果编译器看不到startMultireadingServer 函数的代码,则禁止(根据语言规范)在函数调用周围移动任何代码.

如果编译器查看startMultireadingServer 函数的代码,那么它应该找到一个内存屏障(或任何导致此效果的操作)在函数里面。 (任何 thread-starting 函数都应该在内部有一个内存屏障;这应该在它的契约(Contract)/描述中说明)。同样,编译器无法移动(至少向前移动)绕过此障碍的任何代码。

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

关于c++ - 开始多线程代码之前的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52091818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com