开始多线程代码之前的初始化
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
函数的代码,那么它应该在函数内部找到内存屏障(或任何导致这种效果的操作(。(任何线程启动函数内部都应该有一个内存屏障;这应该在其协定/描述中说明(。同样,编译器不能绕过此障碍移动(至少向前移动(任何代码。
因此,在任何情况下,编译器都不能在该调用之后移动线程创建函数调用之前的代码。
相关文章:
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 如何初始化大线程本地对象?
- 开始多线程代码之前的初始化
- C++函数中的多线程静态 POD 初始化
- 在多线程环境中使用 std::call_once() 初始化
- C++多线程:是本地静态lambda线程安全的初始化
- 静态变量初始化的线程安全性
- 在多线程中初始化向量
- 如何使用win32从多线程上下文初始化线程基元
- 初始化COM C++服务多线程的正确方法
- 多线程客户端中 COM 对象的初始化和实例化
- 实例化变量的 V8 顺序(多线程)
- 实例化创建线程的类的多个实例
- 多线程环境中的静态局部变量初始化
- 测试静态局部对象的初始化是否线程安全
- 在对象构造函数中初始化boost线程
- 局部静态变量初始化是线程安全的
- 我需要并行化或多线程我的应用程序
- 在多线程程序中序列化序列
- 需要帮助模板化多线程访问的结构