Coo*_*kie 11 c++ performance multithreading producer-consumer
嗨,我正在考虑使用快速可靠的生产者消费者队列进行线程切换.我正在使用VC++在Windows上工作.
我的设计基于Anthony Williams队列,也就是说,基本上是一个boost :: mutex,带有boost :: condition_variable.现在通常,notify_one()和唤醒之间的时间在10(罕见)和100微秒之间变化,大多数值在50微秒的范围内.但是,1000中大约有1个超过1毫秒,有些时间超过5毫秒.
我只是想知道这些是否是典型值?是否有更快的信号传递方式?是从这里到管理线程优先级吗?我还没有开始优先考虑,但我只是想知道是否有可能将它变成一个大约10微秒的相当稳定的区域?
谢谢
编辑:使用SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS),平均唤醒时间仍约为50微秒,但异常值较少,现在大多数都在150-200微米左右.除了7毫秒的怪异异常值.嗯...不好.
简短的答案是肯定的,从这里开始,它实际上取决于操作系统管理和线程调度。RTS(实时系统)可以将这 50 微秒减少到大约 15 微秒,更重要的是,它们可以消除异常值。否则旋转是唯一的答案。如果队列数量多于核心数量,则想法可能是让 x 个线程旋转,立即做出反应,其余线程则阻塞。这将涉及某种“主”队列线程,不断旋转以检查所有队列,并且 - 处理项目本身 - 或将它们交给工作线程,其中一些线程也可以旋转以节省这 50 微秒。不过,事情变得很复杂。
最好的办法可能是只使用一个带有旋转消费者线程的无锁多生产者单消费者队列。然后,进入队列的所有项目可能都需要从公共基本类型派生,并且需要包含一些关于如何处理这些项目的元信息。
复杂,但可能。如果我设置了它,我也可能会发布一些代码。
归档时间: |
|
查看次数: |
2846 次 |
最近记录: |