您好,我正在研究使用快速可靠的生产者消费者队列进行线程切换。我正在使用 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 毫秒的异常异常值。嗯……不好。
最佳答案
分摊锁定和线程唤醒开销的一种方法是添加第二个队列并实现双缓冲方法。这可以在消费者端进行批处理:
template<typename F>
std::size_t consume_all(F&& f)
{
// minimize the scope of the lock
{
std::lock_guard<std::mutex> lock(the_mutex);
std::swap(the_queue, the_queue2);
}
// process all items from the_queue2 in batch
for (auto& item : the_queue2)
{
f(item);
}
auto result = the_queue2.size();
the_queue2.clear(); // clears the queue and preserves the memory. perfect!
return result;
}
这并不能解决延迟问题,但可以提高吞吐量。如果出现问题,那么消费者将看到一个大批量,然后可以在没有任何锁定开销的情况下全速处理。这使消费者能够快速 catch 生产者。
关于具有(非常)快速和可靠切换的 C++ 生产者消费者队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6959023/