具有(非常)快速和可靠切换的 C++ 生产者消费者队列

标签 c++ multithreading performance producer-consumer

您好,我正在研究使用快速可靠的生产者消费者队列进行线程切换。我正在使用 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;
}

Working sample code.

这并不能解决延迟问题,但可以提高吞吐量。如果出现问题,那么消费者将看到一个大批量,然后可以在没有任何锁定开销的情况下全速处理。这使消费者能够快速 catch 生产者。

关于具有(非常)快速和可靠切换的 C++ 生产者消费者队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6959023/

相关文章:

C++ 多重继承、基类可见性和可怕的菱形。将祖先基类重新公开为公共(public)?

c++ - vs2017 输出错误但 mingw 有效

c# - 为什么我没有收到 "Cross-thread operation not valid"错误

java - Java 中的线程最大数量?

performance - 哪些服务可用于监控前端性能?

c++ - 将文件存储在 unsigned char 数组中并打印

c++ - Linux/c++ 定时方法保证每 N 秒执行一次,尽管有漂移?

c++ - 异步线程间通信

MySQL慢查询日志——慢到什么程度才算慢?

sql - Cognos 中的过滤器性能 SUBSTRING 与 LIKE