假设我有以下代码:
void* p0 = nullptr;
void* p1 = alloc_some_data();
void f1() {
p0 = p1;
p1 = nullptr;
}
假设f1
在线程 1 上运行。是否有可能(让代码保持原样)另一个线程可能在某个时候看到p0
和p1
(nullptr
如果编译器或硬件重新排序指令,例如第二个赋值发生在第一个之前)?
我问这个的原因是因为我想实现一个垃圾收集器,我想知道我是否需要使用原子指令(std::atomic
)从 GC 线程访问指针。如果 GC 线程看到了没有问题,p0 == p1 == alloc_some_data()
但是如果 GC 线程看到了就会有问题,p0 == p1 == nullptr
因为当它明显可以访问时,它会将先前在 p1 中的数据报告为不可访问。