【发布时间】:2019-11-25 23:54:18
【问题描述】:
我正在尝试实现一个并发无锁队列。我正在密切关注这篇论文:https://www.cs.rochester.edu/u/scott/papers/1996_PODC_queues.pdf 但是本文没有提供公开 Front() 或 Back() 方法的安全方法。 Enqueue() 和 Dequeue() 方法在那里。 (本文详细阐述了无锁版本和带锁版本,我对前者感兴趣)。让我现在直截了当地提出问题。在所有安全检查(类似于 Enqueue)之后,Front() 函数的紧缩归结为:
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. }
我想明确一点,虽然这是一个关于如何实现 Front() 函数的问题,但我主要感兴趣的是如何将上面的 sn-p 重构为一个没有任何锁的原子块。 我担心的是,如果 Thread1 在执行第 1 行后被中断(假设我以原子方式阅读),那么第二个线程清空队列,Thread1 被重新调度并返回一个陈旧的结果。
【问题讨论】:
标签: multithreading