升压C ++锁定空闲队列VS共享队列(boost c++ lock-free queue vs sh

2019-09-01 08:11发布

我在多线程编程很新,我只知道最常见的生产者 - 消费者 - 队列。 我使用的是Boost C ++库,我不知道,如果是更好地利用升压:: lockfree ::队列或周围的std ::队列中的包装类,使用`mutex`和`condition_variable`。

凡使用更好的锁释放的数据结构,并在那里是更好的使用基于`mutex`和`condition_variables`一个简单的实现?

Answer 1:

在您的应用程序都试一下,看看哪个效果最好。

通常情况下,轮询无锁队列中效果最好的队列几乎总是有条目,一个阻塞队列,效果最好的队列几乎总是空的。

阻塞队列的缺点是延迟时间,通常为2-20美国的顺序,由于内核信令。 这可以通过让消费者线程上的每个排队项目所做的工作需要超过这个时间长得多设计系统来减轻。

非阻塞队列的缺点是的CPU和存储器带宽,同时轮询空队列的浪费。 这可以通过使队列为空很少的系统设计来缓解。

截至被评论者已经暗示,无阻塞队列是在单CPU系统中一个非常糟糕的主意。



Answer 2:

(补充)

截至1.54,你应该知道的一些要求

boost::lockfree::queue

  • T必须有一个拷贝构造函数
  • T必须有一个简单的赋值操作符
  • T必须有一个平凡的析构函数

boost::lockfree::stack

  • T必须有一个拷贝构造函数

boost::lockfree::spsc_queue

  • T必须有一个默认的构造函数
  • T必须是可复制


Answer 3:

您还可以使用无锁队列,以避免在实时应用的优先级反转

例如,在Android OpenSL提供一个高优先级线程音频缓冲器队列回调。 如果该线程必须等待一个低优先级的线程持有的锁,它没有高优先级调度数,回调变得不规则,你可能开始欠载音频缓冲 - 这导致了一些不愉快的爆裂声。



Answer 4:

决定归结为提出质疑:“将锁定争是一个问题,要解决的任务是什么?”

在并发环境下锁定解决了两个截然不同的担忧

  • 正确性:确保代码实际上做什么打算。 阻止其他线程的干扰。
  • 吞吐量/可扩展性:允许通过系统的并发操作的持续高“流”。 允许通过增加更多的资源来扩展系统的性能。

这两个问题是对立的目标。 最经典方法是保护共享数据结构与全局锁 。 这确保100%的正确性,但它可以防止扩大高于一定程度的性能,特别是并发级别,由于共享锁导致“交通拥堵”

顺便说一句,你需要小心使用术语时,“无锁”。 从严格意义上讲,协同行动永远是100%无锁。 但可以巧妙地安排协作,所以要减少阻塞到那些真正需要同时访问同一元素的合作伙伴的影响。



文章来源: boost c++ lock-free queue vs shared queue