c++ - 双重锁定解决方法

标签 c++ multithreading thread-safety

我想延迟实例化一个 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,它是...

最佳答案

目前的代码不是线程安全的。编译器可以自由优化连续的 null 检查,因为指针永远不会在同一线程上更改。

我认为使用 c++11 执行此操作的建议方法是使用 std::call_once 或使用静态变量。参见 here举个例子。还有:reference

关于c++ - 双重锁定解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23874052/

相关文章:

java连接方法

c++ - 将 SWI-Prolog 连接到 C++ 的问题

c++ - 欧氏距离使用内在指令

java - Java 中对象实例的上限

c - 使用 pThreads : Deadlock? 实现线程安全队列

java - 当所有任务完成时,执行器服务如何发出信号?

c# - 有用于 C# 的 Guava 吗?

c++ - 将 CStringW 插入 std::wostringstream 时出现问题

c# - WPF 模板表单

c++ - 使用 CRYPTO_thread_setup 的多 SSL 环境