C++线程安全延迟加载

Mik*_*g36 4 c++ multithreading lazy-loading

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

private:
Foo* myFoo_m;

public:
Foo getMyFoo() const
{
    if (myFoo_m == NULL)
    {
       myFoo_m = new Foo();
       // perform initialization
Run Code Online (Sandbox Code Playgroud)

这在单线程环境中运行良好,但如何在多线程环境中处理此问题?我发现的大部分信息都涉及静态单例,但在这种情况下,myFoo是一个公共实例属性.

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

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

Ben*_*enj 5

如果您有权访问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
       }
    }
Run Code Online (Sandbox Code Playgroud)

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