Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading boost:asio HTTP服务器示例3线程计数(Windows构建)_Multithreading_Http_Boost_Boost Asio - Fatal编程技术网

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

Multithreading boost:asio HTTP服务器示例3线程计数(Windows构建),multithreading,http,boost,boost-asio,Multithreading,Http,Boost,Boost Asio,在HTTP服务器boost 2.44的示例3中,创建IO服务时没有线程计数提示。在Windows下,通常将线程计数传递给CreateIoCompletionPort。boost:asio有一个IO服务ctor,它接受线程计数,但在本例中没有使用该ctor。线程数是已知的 我的问题是:有没有理由创建没有线程数的IO服务?boost:asio是否假设每个内核创建的线程数永远不会超过一个?注意:如果传递给CreateIoCompletionPort的线程数为零,则系统将允许每个内核有一个线程同时运行线

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


我的问题是:有没有理由创建没有线程数的IO服务?boost:asio是否假设每个内核创建的线程数永远不会超过一个?注意:如果传递给CreateIoCompletionPort的线程数为零,则系统将允许每个内核有一个线程同时运行线程。

当您在io_服务上调用无参数构造函数时,对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相同。我想假设操作系统最了解的是:当并发提示未指定为boost:asio::io\u服务构造函数时。默认值是无限的或无限制的,这从来不是最佳实践。但是设计者可能觉得这个基于Windows的并发提示是不必要的,因此使默认值与所有平台一致,没有限制。这可能与其他操作系统对该值的解释一致


由于Windows本身并没有从这场惨败中产生任何线索,它甚至不应该在意。并发提示应重命名为max_allowed_concurrency_on_Windows

0表示操作系统最多允许并发运行内核计数线程。这很好,但是有些人喜欢在默认情况下允许每个核心有两个线程。对我来说,使用已知的线程计数更有意义。是的,解决方案是使用不同的构造函数。可能只是保持示例代码的简单。可能就是这样。我希望他们会这么说。Boost示例代码可能有点粗略。在这种情况下,我很感激有几个ASIO示例,这不是一个容易习惯的库。在这些示例中,似乎有很多是为了权宜之计而做的,并不真正适用于人们在现实世界中所做的事情。但这似乎是一般示例代码的一个问题。最后,源代码讲述了真实的故事,这是我们最终必须依赖的。有人更改了标题。boost::asio::io\u服务并发性\u提示问题Windows将是一个很好的标题。所以其他人可以更轻松地使用谷歌。