修改后的线程安全单例

问题描述 投票:1回答:1

我有一个要求,每个线程都应引用相同的foo对象,尽管我可以创建和删除多个Foo,但最终应引用相同的foo对象。我没有C++11支持。

volatile Foo *pfoo = NULL;  //Global

volatile Foo* GetFoo()
{
    if (NULL == InterlockedCompareExchangePointer((volatile PVOID*)pfoo, NULL, NULL))
    {
         Foo *temp = new Foo();
         if (NULL != InterlockedCompareExchangePointer((volatile PVOID*)pfoo, temp, NULL)
         {
             delete temp;
         } 
    }

    return pfoo;
}

[GetFoo()可以从多个线程中调用,也可以作为不同翻译单元中的静态存储(全局)对象的初始化的一部分。

我在这里需要重新考虑任何问题吗?

c++ windows c++03
1个回答
0
投票

InterlockedCompareExchangePointer的第一个参数应该是pfoo的指针,因此您应该传递(PVOID*)&pfoo,否则,pfoo从未真正更新过,并且在尝试更新[时会崩溃] C0](将取消引用空指针)。

另外,我将存储*pfoo调用的结果,并将其强制转换为InterlockedCompareExchangePointer以获取函数的返回值,而不是重新加载Foo*,除了将值成功设置为[ C0],在这种情况下,您可以直接返回pfoo

© www.soinside.com 2019 - 2024. All rights reserved.