双锁定解决方案
Double Locking Workaround
我想惰性实例化一个ViewportFactory
如下:
ViewportFactory* RenderObjectFactory::GetViewportFactory() {
if (viewportFactory == nullptr) {
std::lock_guard<std::mutex> instantiationLockGuard { factoryInstantiationMutex };
if (viewportFactory == nullptr) {
switch (GetAndCommitRenderingAPISelection()) {
case 0:
ViewportFactory* v = new DirectXViewportFactory { };
viewportFactory = v;
break;
}
}
}
return viewportFactory;
}
是否足够线程安全?我的想法是,只有在new DirectXViewportFactory
被正确实例化后才分配viewportFactory
,它是…
当前的代码不是线程安全的。编译器可以自由地优化连续的空检查,因为指针在同一个线程上永远不会改变。
我认为在c++11中建议使用std::call_once或使用静态变量来完成此操作。请看这里的例子。另外:参考
我不相信这是安全的。通过优化,仍然可以在调用构造函数之前为viewportFactory
分配一个指向已分配但未初始化的内存的指针。参见c++中的例6和双重检查锁定的危险。
即使它是安全的,这段代码也不是易于维护的。当稍后有人出现时,也许是您,也许是完全不熟悉它的人,很容易在错误的地方添加代码,从而引入竞争条件。这些bug很难重现和隔离——性能提升真的值得冒这个风险吗?
正如@ dieterl
相关文章:
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- 计算每个节点的树高,帮助我解释这个代码解决方案
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- visual c++,如何获取解决方案目录中的代码
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- C++Matching Brackets 2解决方案不起作用
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 无法在问题解决方案中执行输出逻辑
- 最大的回文产品 - 程序未运行,编写解决方案但无法理解问题
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- 在一个解决方案中针对第三方静态库 (Creo) 的不同版本(版本)进行构建
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- N-queen问题:无法弄清楚为什么我的解决方案不起作用
- 锁定目录的 C++ 解决方案 - Linux
- 这个解决方案对MSVC的双重检查锁定错误和函数静态有什么问题?
- 双锁定解决方案