【发布时间】:2017-04-12 09:24:42
【问题描述】:
我正在使用 boost::asio 编写一个 Http Server。对于大文件,为了避免将整个文件读入内存并发送到网络,我使用 boost::asio::async_write 在网络上逐段读取。
问题是我的生产者(从文件中读取的函数)比消费者(boost::asio::async_write)快得多,这导致大文件的内存消耗很大。
我想通过限制缓冲区列表来避免这个问题。这似乎是一个简单的生产者/消费者问题,但是,我不想在这样做时阻塞线程。
我将 boost::io_service 与可配置的 n 个线程的线程池一起使用,如果我们对大文件有太多请求,我不想让服务器不再提供任何请求。
所以我的问题是: - 如何在不阻塞线程的情况下设计这种机制? - 我是否应该测试列表大小,然后如果它已经太大,生成一个截止时间计时器,它将执行 io_service::post 并继续阅读我的文件? - 有没有更好的处理方法?
【问题讨论】:
-
好吧。假设您通过 async_write 发送 N 个字节。启动您的 async_write 并同时从文件中读取接下来的 N 个字节(发布 2 个任务)。然后当你的 async_write 完成时,重复同样的事情。因此,您不会将任何尚未发送的文件部分保存在内存中。
标签: c++ multithreading asynchronous boost-asio producer-consumer