c++ - boost C++ 无锁队列与共享队列

标签 c++ multithreading boost producer-consumer lock-free

我是多线程编程的新手,我只知道最常见的 Producer-Consumer-Queue。 我正在使用 boost c++ 库,我不知道是使用 boost::lockfree::queue 还是使用 `mutex` 和 `condition_variable` 的 std::queue 周围的包装类更好。

哪里使用无锁数据结构更好,哪里使用基于 `mutex` 和 `condition_variables` 的简单实现更好?

最佳答案

在您的应用中尝试两者,看看哪个表现最好。

通常,轮询无锁队列在队列几乎总是有条目时效果最好,而阻塞队列在队列几乎总是空的时候效果最好。

由于内核信号,阻塞队列的缺点是延迟,通常为 2-20 uS。这可以通过设计系统来缓解,使消费者线程在每个排队项目上完成的工作花费的时间比这个间隔长得多。

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

正如评论者已经暗示的那样,非阻塞队列在单 CPU 系统上是一个非常糟糕的主意。

关于c++ - boost C++ 无锁队列与共享队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16275112/

相关文章:

c++ - 如何检查忍者并行构建的返回值?

c++ - 如何避免来自其他 .cxx 的重复枚举值

c# - 应该在 ReaderWriterLockSlim 锁上调用 Dispose() 吗?

c# - Parallel.ForEach(task.Wait) 和 Task.WaitAll 的区别

c++ - 指定 boost::program_options 值的允许值范围

c++ - 如何检查类 obj 是否为空

c - 如何干净地中断 recv 调用中阻塞的线程?

c++ - boost range for_each、bind、copy 和 back_inserter 的组合失败

c++ - 在编译时获取 boost::function arity?

c++ - Mysql connector/C++ for windows 2010 express 不编译