Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 增强c++;无锁队列与共享队列_C++_Multithreading_Boost_Producer Consumer_Lock Free - Fatal编程技术网

C++ 增强c++;无锁队列与共享队列

C++ 增强c++;无锁队列与共享队列,c++,multithreading,boost,producer-consumer,lock-free,C++,Multithreading,Boost,Producer Consumer,Lock Free,我对多线程编程相当陌生,我只知道最常见的生产者-消费者队列。 我使用的是Boost C++库,我不知道是否更好地使用Booo:::CopyFuel::队列或围绕STD的包装类::使用“互斥”和“条件变量”的队列。 哪里使用无锁数据结构更好,哪里使用基于“互斥”和“条件变量”的简单实现更好? 在应用程序中尝试这两种方法,看看哪一种效果最好 通常,当队列几乎总是有条目时,轮询无锁队列效果最佳,而当队列几乎总是空时,阻塞队列效果最佳 阻塞队列的缺点是延迟,由于内核信令,延迟通常为2-20us。通过

我对多线程编程相当陌生,我只知道最常见的生产者-消费者队列。 我使用的是Boost C++库,我不知道是否更好地使用Booo:::CopyFuel::队列或围绕STD的包装类::使用“互斥”和“条件变量”的队列。

哪里使用无锁数据结构更好,哪里使用基于“互斥”和“条件变量”的简单实现更好?

在应用程序中尝试这两种方法,看看哪一种效果最好

通常,当队列几乎总是有条目时,轮询无锁队列效果最佳,而当队列几乎总是空时,阻塞队列效果最佳

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

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

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

(补充)

从1.54开始,您应该了解一些要求

  • T必须有一个复制构造函数
  • T必须有一个平凡的赋值运算符
  • T必须有一个平凡的析构函数

  • T必须有一个复制构造函数

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

这个决定归结为一个问题:“锁争用是否会成为待解决任务的一个问题?”

在并发环境中锁定解决了两个不同的问题

  • 正确性:确保代码实际执行预期的操作。防止其他螺纹的干扰
  • 吞吐量/可伸缩性:允许通过系统的持续高并发操作流。允许通过添加更多资源来扩展系统的性能
这两个问题是对立的目标。经典的方法是使用全局锁保护共享数据结构。这确保了100%的正确性,但它阻止了性能的提升,特别是在一定程度上的并发级别,因为共享锁会导致“流量拥塞”


顺便说一句,使用术语“无锁”时需要小心。严格地说,协作操作永远不可能是100%无锁的。但是可以巧妙地安排协作,从而减少阻塞对那些确实需要同时访问同一元素的合作伙伴的影响。

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


例如,Android上的OpenSL在高优先级线程上提供音频缓冲队列回调。如果此线程必须等待低优先级线程持有的锁,则其高优先级调度将不起任何作用,回调将变得不规则,您可能会开始运行音频缓冲区不足,这会导致一些不愉快的弹出声音。

这主要取决于您是否为多核处理器编程。如果目标处理器是单核处理器,则应使用共享_队列。目标计算机是2核4线程。好的,我试试boost::lockfree。我认为即使在单核处理器中,无锁队列也有一席之地。例如,如果您有一个在任何情况下都不应该被阻塞的实时线程,并且如果它需要将数据传递给另一个线程(例如,“空闲任务”线程),那么无锁队列将是一个很好的解决方案。