假设一个原子指针永远不会为 nullptr ,那么在没有同步的情况下读取它是否安全?就像下面的代码一样,假设有两个线程writer
同时运行reader
。
std::atomic<int>* g_atomic = new std::atomic<int>{};
void writer()
{
for (int i = 0; i < 101; i++)
{
auto* new_atomic = new std::atomic<int>{i};
std::atomic_thread_fence(std::memory_order_seq_cst); // memory barrier.
g_atomic = new_atomic; // ignore the memory leak
}
}
void reader()
{
auto value = g_atomic->load();
while (value < 100)
{
assert(value >= 0 && value <= 100);
value = g_atomic->load();
}
}
我所说的安全是指,我将始终读取从 0 到 100 的值,我不会读取无效指针或在初始化之前读取指向的对象。
我的直觉告诉我这是安全的,因为
- 在所有架构上,指针都是以原子方式读取或写入的。
- 指向的值是原子读取的,必须从 RAM 中获取,并且写入之前的内存屏障保证 RAM 始终正确。
那么,这安全吗?也许只适用于所有常见的架构?