我应该在FIFO队列中添加内存屏障吗?

时间:2013-01-05 01:49:27

标签: c++ multithreading fifo memory-barriers

我正在使用链表实现非锁定FIFO。

FIFO的Enqueue基本上是:

void Enqueue(CNode node)
{
  m_tail->m_next = node;

  // Do I need a memory barrier here?

  m_tail = node;
}

我想知道是否需要添加内存屏障,如果它是单线程的(即,编译器/处理器可以重新排列上面两行的顺序吗?)。如果它是多线程的(即,像单个读取单个写入器一样简单)会怎么样?

修改:根据here,这是数据反依赖的情况,不应重新排序语句。所以我假设CPU应该总是以给定的顺序访问内存。是吗?

1 个答案:

答案 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;)。这是否足以保证正确执行是不确定的,它取决于另一端的代码读取的内容。