【发布时间】:2016-12-20 11:16:16
【问题描述】:
我正在构建一个阻塞的并发队列(即,如果队列中没有任何内容,消费者就会休眠,直到生产者唤醒)。我的用例受到限制,因为出队操作将始终阻塞在空队列上;没有tryDequeue。
我当前的实现只是使用std::mutex 和std::condition_variable。我想知道用无锁算法改进数据结构是否有意义。在队列为空的情况下,这可能没有意义,因为消费者无论如何都必须阻止。但是在队列非空的情况下,我能做些什么吗?
【问题讨论】:
-
为什么要结束投票?
-
您不能以无锁方式明智地“阻止”。 (你可以忙循环,但这没有用。)
-
@KerrekSB 我在想也许在出队时,我可以先无锁地尝试弹出前面,只有当这不起作用时才进入阻塞阶段? (当然,入队必须相应地改变。)
-
@Kerrek,busy-loops (AKA spinlocks) 是 通常用于这种目的 - 即当您期望其他线程“锁定”共享对象一段时间时间比上下文切换到内核执行传统阻塞所产生的成本要短。
-
大多数现代锁在切换上下文之前都会旋转;因此,如果不进行更重大的设计更改,您可能一无所获。
标签: c++ multithreading