アトミックポインターがあるとします:
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
null に等しいと判断した場合、それらすべてがメモリを割り当て、そのうちの N - 1 個が agian を解放します。
より良いアプローチで同様のメソッドを作成するにはどうすればよいですか。