假設我有一個原子指針:延遲初始化
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'是無鎖的。 –