当前位置: 首页 > 知识库问答 >
问题:

双锁并发队列算法问题

席言
2023-03-14

因此,我正在阅读Maged M.Michael和Michael L.Scott的文章《简单、快速、实用的非阻塞和阻塞并发队列算法》,有一个小问题我不明白:

假设我们有两个并发线程,它们在队列初始化后立即被触发。其中一个线程调用< code>enqueue,另一个调用< code>dequeue。是什么阻止它们同时访问虚拟节点的< code>next字段?当< code>enqueue线程写入< code>next字段时,< code>dequeue线程不能读取它吗?他们都用不同的锁...所以我不明白它们之间是什么同步的..

谢谢

共有1个答案

桑博远
2023-03-14

enqueue()只操纵尾部,dequeue()只操纵头部,所以它们不需要使用相同的锁。有一种特殊的情况,头和尾指向同一个节点,即在initialize中创建的“虚拟”节点。而且,当dequeue()试图读取它时,enqueue()可能正在写入该节点下一个指针,这是正确的。

并行读写没有问题。请注意,enqueue()创建一个新节点,并完全初始化该对象,然后通过将其写入尾部使其可见-

因此,在您的场景中,enqueue()和dequeue(()都是立即调用的,有两种可能性:

  • enqueue()写入尾部-
 类似资料:
  • 有人能帮我找到我的PQ的问题吗?

  • 问题内容: 也许这是一个愚蠢的问题,但我似乎找不到一个明显的答案。 我需要一个仅包含唯一值的并发FIFO队列。尝试添加队列中已经存在的值只会忽略该值。如果不是为了线程安全,那将是微不足道的。在Java中是否存在数据结构,或者在Interweb上是否存在代码snipit表现出这种行为? 问题答案: 如果您想要比完全同步更好的并发性,那么我知道有一种方法可以使用ConcurrentHashMap作为支

  • 队列自旋锁 这是本章节的第二部分,这部分描述 Linux 内核的和我们在本章的第一部分所见到的--自旋锁的同步原语。在这个部分我们将继续学习自旋锁的同步原语。 如果阅读了上一部分的相关内容,你可能记得除了正常自旋锁,Linux 内核还提供自旋锁的一种特殊类型 - 队列自旋锁。 在这个部分我们将尝试理解此概念锁代表的含义。 我们在上一部分已知自旋锁的 API: spin_lock_init - 为给

  • 问题内容: 我正在尝试运行此方法,以将通用值(EltType)插入到双面队列(双端队列)中,但是我一直收到无法确定的outOfBoundsException。有人能帮我这个忙吗?这只是代码的一部分,但我认为可以将其拼凑起来! 错误: 问题答案: 应该变成 您使用了“小于或等于”,但是数组的最后一项的索引为(length-1)。

  • 我们的程序正在使用队列。多个消费者正在处理消息。 消费者执行以下操作: 从队列接收打开或关闭状态消息。 从存储库中获取最新状态。 比较存储库的状态和从消息接收到的状态。 如果开/关状态不同,则更新数据。(此时其他相关数据也更新。) 假设此过程由多个使用者处理,则预计会出现以下问题。 生产者发送消息1: on、2: off和3: on。 消费者A接收消息#1并将消息#1存储在存储中,因为没有最新数据

  • 栈 1. 数组实现 2. 链表实现 队列 栈 // java public interface MyStack extends Iterable { MyStack push(Item item); Item pop() throws Exception; boolean isEmpty(); int size(); } 1. 数组实现 // java