3

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

EnqueueFIFO的基本是:

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

  // Do I need a memory barrier here?

  m_tail = node;
}

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

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

4

1 回答 1

4

编译器不得重新排列您的 m_tail 和 m_tail->next 分配,以便在设置 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;. 这是否足以保证正确执行还不确定,这在一定程度上取决于另一端读取的代码做了什么。

于 2013-01-05T02:00:46.067 回答