使用无锁队列实现将指针存储到预先分配的一组缓冲区时,我发现一个线程仍然在写一些缓冲区,而另一个线程开始使用它。我已经使用内存屏障保护了缓冲区写入和读取,但似乎无法正常工作。
线程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