Boost C ++线程

时间:2012-05-04 22:24:50

标签: c++ http boost

我已经构建了来自:

的server3示例

http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/examples.html

我做的唯一一件事 - 修改了request_handler.cpp

// Decode url to path.
std::string request_path;
if (!url_decode(req.uri, request_path))
{
    rep = reply::stock_reply(reply::bad_request);
    return;
}

// Request path must be absolute and not contain "..".
if (request_path.empty() || request_path[0] != '/'
  || request_path.find("..") != std::string::npos)
{
    rep = reply::stock_reply(reply::bad_request);
    return;
}

// Fill out the reply to be sent to the client.
rep.status = reply::ok;

std::string filename = "/tmp/test.mp4";
std::ifstream file (filename.c_str(), std::ios::in|std::ios::binary);

char buf[1024000]; // 1MB Buffer read
while (file.read(buf, sizeof(buf)).gcount() > 0)
       rep.content.append(buf, file.gcount());

rep.headers.resize(9);
rep.headers[0].name = "Content-Length";
rep.headers[0].value = boost::lexical_cast<std::string>(rep.content.size());
rep.headers[1].name = "Content-Type";
rep.headers[1].value = "video/mp4";

当我打开chrome并点击服务器时,我可以获得视频,没问题。在同一时间,我打开另一个选项卡并点击服务器,没有任何反应。看起来它要等到第一个标签完成。

目标是让服务器处理多个连接并发送多个文件..

1 个答案:

答案 0 :(得分:0)

您的服务器的响应能力将基于以下内容:

  • 您使用阻止磁盘IO调用,因此在读取数据时会挂起一个线程。为了获得最佳性能,您希望尽可能使用非阻塞功能。
  • 运行io_service :: run()。
  • 的线程数

最简单的方法是运行更多运行io_service :: run()的线程。我的猜测是你只运行一个线程,这就是为什么你没有在第二个标签中得到任何响应,直到第一个标签完成。

更好的解决方案是研究使用非阻塞磁盘io。