我有一个要求,每个线程都应引用相同的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()
可以从多个线程中调用,也可以作为不同翻译单元中的静态存储(全局)对象的初始化的一部分。
我在这里需要重新考虑任何问题吗?
InterlockedCompareExchangePointer
的第一个参数应该是pfoo
的指针,因此您应该传递(PVOID*)&pfoo
,否则,pfoo
从未真正更新过,并且在尝试更新[时会崩溃] C0](将取消引用空指针)。
另外,我将存储*pfoo
调用的结果,并将其强制转换为InterlockedCompareExchangePointer
以获取函数的返回值,而不是重新加载Foo*
,除了将值成功设置为[ C0],在这种情况下,您可以直接返回pfoo
。