假设我有一个原子指针:延迟初始化
std::atomic<void*> mItems;
,并在功能,当一个线程需要访问,它首先检查它,如果它为null,线程将分配内存它:
void* lItems = std::atomic_load_explicit(&mItems, memory_order_relaxed);
if(lItems == nullptr)
{
void* lAllocation = malloc(...);
if(!std::atomic_compare_exchange_strong_explicit(
&mItems,
&lItems,
lAllocation,
memory_order_relaxed,
memory_order_relaxed))
{
free(lAllocation);
}
}
...
但如果N线程运行此方法并发看到mItems
等于空,然后所有的人都将分配内存和N - 1它们将释放agian。
我如何用更好的方法编写类似的方法。
Punch [“double checked locking”](http://en.wikipedia。org/wiki/Double-checked_locking)到您最喜欢的搜索引擎中。 –
惊喜!这是一个解决的问题http://en.cppreference.com/w/cpp/thread/call_once –
@ R.MartinhoFernandes:但我怀疑'call_once'是无锁的。 –