假设我有一个原子指针:
std::atomic<void*> mItems;
在一个函数中,当一个线程需要访问它时,它首先检查它,如果它为空,线程将为它分配内存:
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。
我如何用更好的方法编写类似的方法。