3

リンク リストを使用して非ロック FIFO を実装しています。

EnqueueFIFO の基本は次のとおりです。

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

  // Do I need a memory barrier here?

  m_tail = node;
}

シングルスレッドの場合、メモリバリアを追加する必要があるかどうか疑問に思っています(つまり、コンパイラ/プロセッサは上記の2行の順序を再配置できますか?)。マルチスレッドの場合 (つまり、シングル リード シングル ライターの場合と同じくらい単純) はどうでしょうか。

編集: hereによると、これはデータの反依存関係のケースであり、ステートメントを並べ替えるべきではありません。したがって、CPUは常に指定された順序でメモリにアクセスする必要があると思います。そうですか?

4

1 に答える 1

4

コンパイラは、m_tail->next が設定される前に m_tail がノードに割り当てられるように、m_tail と m_tail->next の割り当てを再配置してはなりません。ただし、マルチスレッド ソリューションの場合は、次のことを考慮する必要があります。

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 に答える