我正在使用链表实现非锁定FIFO。
FIFO的Enqueue
基本上是:
void Enqueue(CNode node)
{
m_tail->m_next = node;
// Do I need a memory barrier here?
m_tail = node;
}
我想知道是否需要添加内存屏障,如果它是单线程的(即,编译器/处理器可以重新排列上面两行的顺序吗?)。如果它是多线程的(即,像单个读取单个写入器一样简单)会怎么样?
修改:根据here,这是数据反依赖的情况,不应重新排序语句。所以我假设CPU应该总是以给定的顺序访问内存。是吗?
答案 0 :(得分:4)
编译器不得重新排列m_tail和m_tail->下一个赋值,以便在设置m_tail-> next之前为m_tail分配节点。但是,对于多线程解决方案,您可能不得不担心:
temp = m_tail;
m_tail = node;
temp->next = node;
node->next = NULL;
对于内存屏障,编译器和/或处理器必须在写入m_tail->next = node;
之前完成node->next = NULL;
(和m_tail = node;
)。这是否足以保证正确执行是不确定的,它取决于另一端的代码读取的内容。