boost:asio HTTP服务器示例3线程计数(Windows构建)

时间:2010-12-08 23:28:32

标签: multithreading http boost boost-asio

在HTTP服务器的示例3中(boost 2.44),创建的IO服务没有线程计数提示。在Windows下,通常会将线程计数传递给CreateIoCompletionPort()。 boost:asio有一个IO服务ctor,它接受线程计数,但在这个例子中没有使用ctor。并且线程数已知。

我的问题是:是否有理由在没有线程计数的情况下创建IO服务? boost:asio假设一个人永远不会创建比每个核心更多的线程吗?请注意,如果传递给CreateIoCompletionPort()的线程数为零,系统将允许每个核心一个线程同时运行线程。

2 个答案:

答案 0 :(得分:0)

当您在io_service上调用无参数构造函数时,对CreateIoCompletionPort的调用将在此处的代码中使用0xffffffff的线程计数结束:

void win_iocp_io_service::init(size_t concurrency_hint)
{
  iocp_.handle = ::CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0,
      static_cast<DWORD>((std::min<size_t>)(concurrency_hint, DWORD(~0))));
  if (!iocp_.handle)
  {
    DWORD last_error = ::GetLastError();
    boost::system::error_code ec(last_error,
        boost::asio::error::get_system_category());
    boost::asio::detail::throw_error(ec, "iocp");
  }
}

不确定Windows是如何解释这一点但是调用工作正常,所以我认为这与使用0相同。我猜这个假设是操作系统最了解?

答案 1 :(得分:0)

未向concurrency_hint构造函数指定boost:asio::io_service()时。默认为无限无界,这绝不是最佳做法。但设计人员可能认为这种基于Windows的concurrency_hint是不必要的,因此默认情况下与所有平台一致(没有限制)。这可能与其他操作系统解释此值的方式一致。

由于Windows本身没有创造出整个惨败的线程,因此它甚至不应该关心。 concurrency_hint应重命名为max_allowed_concurrency_on_Windows