C++ 增强c++;无锁队列与共享队列
我对多线程编程相当陌生,我只知道最常见的生产者-消费者队列。 我使用的是Boost C++库,我不知道是否更好地使用Booo:::CopyFuel::队列或围绕STD的包装类::使用“互斥”和“条件变量”的队列。 哪里使用无锁数据结构更好,哪里使用基于“互斥”和“条件变量”的简单实现更好?C++ 增强c++;无锁队列与共享队列,c++,multithreading,boost,producer-consumer,lock-free,C++,Multithreading,Boost,Producer Consumer,Lock Free,我对多线程编程相当陌生,我只知道最常见的生产者-消费者队列。 我使用的是Boost C++库,我不知道是否更好地使用Booo:::CopyFuel::队列或围绕STD的包装类::使用“互斥”和“条件变量”的队列。 哪里使用无锁数据结构更好,哪里使用基于“互斥”和“条件变量”的简单实现更好? 在应用程序中尝试这两种方法,看看哪一种效果最好 通常,当队列几乎总是有条目时,轮询无锁队列效果最佳,而当队列几乎总是空时,阻塞队列效果最佳 阻塞队列的缺点是延迟,由于内核信令,延迟通常为2-20us。通过
在应用程序中尝试这两种方法,看看哪一种效果最好 通常,当队列几乎总是有条目时,轮询无锁队列效果最佳,而当队列几乎总是空时,阻塞队列效果最佳 阻塞队列的缺点是延迟,由于内核信令,延迟通常为2-20us。通过设计系统,使使用者线程在每个排队项目上完成的工作比此时间间隔长得多,可以缓解这一问题 非阻塞队列的缺点是在轮询空队列时浪费CPU和内存带宽。通过设计系统使队列很少为空,可以缓解这一问题 正如评论者已经暗示的那样,在单CPU系统上,非阻塞队列是一个非常糟糕的主意。(补充) 从1.54开始,您应该了解一些要求
- T必须有一个复制构造函数
- T必须有一个平凡的赋值运算符
- T必须有一个平凡的析构函数
- T必须有一个复制构造函数
- T必须有一个默认构造函数
- 它必须是可复制的
- 正确性:确保代码实际执行预期的操作。防止其他螺纹的干扰
- 吞吐量/可伸缩性:允许通过系统的持续高并发操作流。允许通过添加更多资源来扩展系统的性能
顺便说一句,使用术语“无锁”时需要小心。严格地说,协作操作永远不可能是100%无锁的。但是可以巧妙地安排协作,从而减少阻塞对那些确实需要同时访问同一元素的合作伙伴的影响。您还可以使用无锁队列,以避免实时应用程序中的优先级反转
例如,Android上的OpenSL在高优先级线程上提供音频缓冲队列回调。如果此线程必须等待低优先级线程持有的锁,则其高优先级调度将不起任何作用,回调将变得不规则,您可能会开始运行音频缓冲区不足,这会导致一些不愉快的弹出声音。这主要取决于您是否为多核处理器编程。如果目标处理器是单核处理器,则应使用共享_队列。目标计算机是2核4线程。好的,我试试boost::lockfree。我认为即使在单核处理器中,无锁队列也有一席之地。例如,如果您有一个在任何情况下都不应该被阻塞的实时线程,并且如果它需要将数据传递给另一个线程(例如,“空闲任务”线程),那么无锁队列将是一个很好的解决方案。