C++ 线程安全延迟加载

标签 c++ multithreading lazy-loading

我有一个类似于以下的属性:

private:
Foo* myFoo_m;

public:
Foo getMyFoo() const
{
    if (myFoo_m == NULL)
    {
       myFoo_m = new Foo();
       // perform initialization

这在单线程环境中运行良好,但是我如何在多线程环境中处理它?<​​/strong>我发现的大多数信息都与静态单例有关,但在这种情况下, myFoo 是一个公共(public)实例属性。

我正在从 C#(我可以使用 Lazy)和 Java(我可以使用双重检查锁定)移植它,但似乎没有一种直接的方法可以在 C++ 中执行此操作。 我不能依赖任何外部库(没有 BOOST),这需要在 Windows 和 Linux 上工作。我也不能使用 C++11。

任何见解都会很好。我是 C++ 新手。

最佳答案

如果您有权访问 c++11,您可以使用 std::mutex 来锁定防止多个线程初始化惰性部分。 (注意:std::mutex 仅在带有 VS2012 的 Windows 上可用)

您甚至可以使用 std::lock_guard 执行范围内的互斥锁获取:

private:

std::mutex m_init_mutex;

public:

Foo getMyFoo() const
{
    {
       std::lock_guard<std::mutex> lock(m_init_mutex);
       if (myFoo_m == NULL)
       {
          myFoo_m = new Foo();
          // perform initialization
       }
    }

编辑:OP 现在声明 C++11 不是一个选项,但也许这个答案在未来会有用

关于C++ 线程安全延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13198726/

相关文章:

c++ - 基于指针容器循环的范围内的值语义

java - 如何正确关闭 javafx Alerts/fileChooser 等

java - Java中有多个线程访问同一方法时的线程安全性

angular - Angular 延迟加载会减小包大小吗?

entity-framework - 为什么 Entity Framework 需要一个 ICollection 来进行延迟加载?

Hibernate 4 ClassCastException 延迟加载,而 EAGER 工作正常

c++ - map C++ 中的迭代器失效

c++ - 为什么这个简单的 libpqxx 代码会泄漏内存?

c++ - 如何在 Opencv 中显示垫子

multithreading - 减少缓存行失效的总线流量