在HTTP服务器的示例3中(boost 2.44),创建的IO服务没有线程计数提示。在Windows下,通常会将线程计数传递给CreateIoCompletionPort()。 boost:asio有一个IO服务ctor,它接受线程计数,但在这个例子中没有使用ctor。并且线程数已知。
我的问题是:是否有理由在没有线程计数的情况下创建IO服务? boost:asio假设一个人永远不会创建比每个核心更多的线程吗?请注意,如果传递给CreateIoCompletionPort()的线程数为零,系统将允许每个核心一个线程同时运行线程。
答案 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