【发布时间】:2011-10-21 00:03:45
【问题描述】:
您好,我正在研究使用快速可靠的生产者消费者队列进行线程切换。我正在使用 VC++ 在 Windows 上工作。
我的设计基于Anthony Williams 队列,即基本上是带有 boost::condition_variable 的 boost::mutex。现在通常 notify_one() 和唤醒之间的时间在 10(罕见)和 100 微秒之间变化,大多数值在 50 微秒范围内。但是,每 1000 人中约有 1 人超过 1 毫秒,有些则超过 5 毫秒。
我只是想知道这些是否是典型值?有没有比旋转更快的信号方式?是从这里开始到管理线程优先级吗?我还没有开始玩优先级,但我只是想知道是否有机会将其置于大约 10 微秒的相当稳定的区域?
谢谢
编辑:使用 SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS),平均唤醒时间仍约为 50 微,但是异常值要少得多,现在大多数约为 150-200 微。除了 7 毫秒的异常异常值。嗯……不好。
【问题讨论】:
-
你能使用额外的第三方库吗?我发现通常无锁实现的性能要好得多,英特尔的线程构建模块中有一个很好的实现。
-
题外话,但也许你想看看 Sutter 的 wait-free queue,它不使用锁。
-
@Chad:几乎不应该对锁有任何争用,我的理解是,在没有争用的情况下,Windows 上的 boost mutex 相当便宜并且保留在用户空间中,因此切换到无锁可能不会改善这种情况这么多......我认为这里的问题更多的是找到唤醒消费者线程的最快方法。
-
@Kerrek:感谢指点,好文章,但我想避免旋转的原因是生产者消费者队列的数量可能比核心数量大很多。我的理解是,这不是一个很好的场景?
-
@Cookie:确实不是,在这种情况下,自旋会阻碍真正工作的线程的进度,你也许可以使用微睡眠。
标签: c++ multithreading performance producer-consumer