ロックレス キューの実装を使用して、事前に割り当てられた一連のバッファーへのポインターを格納しているときに、あるスレッドがバッファーの使用を開始している間に、一部のバッファーが 1 つのスレッドによってまだ書き込まれていることがわかりました。バッファーの書き込みと読み取りをメモリバリアで既に保護していますが、機能していないようです。
スレッド 1 ループ:
auto b=queue.AcquireBuffer();
for (int x=0;x<BUF_SIZE;x++)
{
b->GetData()[x]=-999999999990; // A
}
atomic_thread_fence(memory_order_seq_cst) // edit: still does not work
high_resolution_clock::time_point tp=high_resolution_clock::now();
b->GetData()[1]=1+time_diff(tp,tp_normal); // B
atomic_thread_fence(memory_order_seq_cst);
queue.PushBuffer(b);
スレッド 2 ループ:
auto bb=queue.Peak();
atomic_thread_fence(memory_order_seq_cst);
if ((bb[0])->GetData()[1] < 0) {
std::cout<<"fail"<<endl;
ready=true;
while (1) {}
}
queue.Pop();
しばらくすると出力として「失敗」が表示されます。これは、スレッド 2 が A および B ブロックの順序付けられていない実行を確認することを意味します。これらを順番にやっていきたいと思います。どうすれば修正できますか?(time_diff は常に正の数を返すと仮定します)
キューのソース: http://pastebin.com/raw.php?i=PFBzMPPF
ソース全体: https://docs.google.com/file/d/0B8gY3VVJJr1IMktobnhYelBva2c/edit?usp=docslist_api