Multithreading 如何在无锁并发队列中实现“Front”方法?

Multithreading 如何在无锁并发队列中实现“Front”方法?,multithreading,Multithreading,我正在尝试实现一个并发无锁队列。我密切关注这篇论文: 但本文并没有提供一种安全的方法来暴露前面或后面的方法。有排队和出列方法。本文阐述了一个无锁版本和一个带锁版本,我对前者感兴趣。现在让我把问题弄清楚。在所有类似排队的安全检查之后,前端功能的关键归结为: 1. if(local_copy_of_head == curr_shared_head) { // Let's say I read this atomically. The equality means the head didn't m

我正在尝试实现一个并发无锁队列。我密切关注这篇论文: 但本文并没有提供一种安全的方法来暴露前面或后面的方法。有排队和出列方法。本文阐述了一个无锁版本和一个带锁版本,我对前者感兴趣。现在让我把问题弄清楚。在所有类似排队的安全检查之后,前端功能的关键归结为:

1. if(local_copy_of_head == curr_shared_head) {  // Let's say I read this atomically. The equality means the head didn't move since the time I copied.
2.   return local_copy_of_head;
3. }
我想说明的是,虽然这是一个关于如何实现前端函数的问题,但我主要感兴趣的是如何将上面的代码片段重构成一个没有任何锁的原子块。
我担心的是,如果Thread1在执行第1行后被中断,我会以原子的方式阅读这篇文章,比如说,第二个线程会清空队列,Thread1会被重新调度并返回一个过时的结果。

你不能。你可以制作一个糟糕的版本,它可以运行很多次,但总的来说是失败的。要揭开免锁的神秘面纱,用上一个术语“忙碌等待”来代替它。Busy waiting更恰当地捕获消耗cpu资源的选择,希望您的比赛结束条件能够被适当地检测到,因此结果是一致的

通过放弃队列前端的前端,您不知道该客户端在承诺吸收它出列之前可能会使用它多长时间,sic:这不是出列的意思。因此,前端函数只能是设计糟糕的队列实现的前端

从来都不是很长的时间。好的,不是永远,但是,它需要一个伴随函数absold,它可以告诉我们,自从调用了相应的Front之后,队列头的这种吸收是队列头上的唯一操作;因此,队列处于相同的状态。如果不是,则必须向调用者返回一个故障,在该故障中,调用者必须回滚正在进行的任何操作以反映此故障

好的,所以不是永远,但是已经完成的所有工作就是将事务语义提升到一个级别,向设计者提示可能设计有点欠缺。因此,您有一个无事务队列。我们中的一些人过去称之为增量