C++ Boost.Asio SSL神秘线程

C++ Boost.Asio SSL神秘线程,c++,ssl,boost,boost-asio,C++,Ssl,Boost,Boost Asio,我注意到以下代码启动了两个线程(Windows8.1,MSVC2013)。在acceptor.accept()等待约10秒后,它将产生另外两个线程。如果进程空闲几分钟,它将减少到三分钟 #include <boost/asio.hpp> #include <boost/asio/ssl.hpp> using namespace boost::asio; int main(int argc, char** argv) { int test; ssl::

我注意到以下代码启动了两个线程(Windows8.1,MSVC2013)。在
acceptor.accept()
等待约10秒后,它将产生另外两个线程。如果进程空闲几分钟,它将减少到三分钟

#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>

using namespace boost::asio;

int main(int argc, char** argv)
{
    int test;

    ssl::context ctx(ssl::context::tlsv12_server);

    /* ctx settings */

    io_service io_service;

    ssl::stream<ip::tcp::socket> socket(io_service, ctx);
    ip::tcp::acceptor acceptor(io_service, ip::tcp::endpoint(ip::tcp::v4(), 4433), false);

    acceptor.accept(socket.lowest_layer());

    socket.handshake(ssl::stream_base::server);

    read(socket, buffer(&test, sizeof(test)));

    boost::system::error_code error;
    socket.shutdown(error);
    if (error && error != boost::asio::error::eof) throw boost::system::system_error(error);

    socket.lowest_layer().shutdown(ip::tcp::socket::shutdown_both);
    socket.lowest_layer().close();
}
#包括
#包括
使用名称空间boost::asio;
int main(int argc,字符**argv)
{
智力测验;
ssl::context ctx(ssl::context::tlsv12_服务器);
/*ctx设置*/
io_服务io_服务;
ssl::流套接字(io_服务,ctx);
ip::tcp::acceptor-acceptor(io_服务,ip::tcp::endpoint(ip::tcp::v4(),4433),false);
acceptor.accept(socket.lower_layer());
socket.handshake(ssl::stream\u base::server);
读取(套接字、缓冲区和测试、sizeof(测试));
boost::system::error\u code error;
套接字关闭(错误);
if(error&&error!=boost::asio::error::eof)抛出boost::system::system\u错误(error);
socket.lower_layer().shutdown(ip::tcp::socket::shutdown_两者);
socket.lower_layer().close();
}
这种行为对我来说有点奇怪,我甚至不使用任何异步操作、线程或其他东西


我做了一些测试,似乎只有在使用SSL套接字时才会出现问题。 这两个示例(阻塞和非阻塞)只启动一个线程

我还尝试了“官方”异步SSL示例,但它产生了相同的问题



是什么导致了这个问题?我可以消除这种行为吗?

您是否调试了线程(检查调用堆栈以查看运行的是什么)

无论如何,如果真正的异步不可用,Asio IO服务可以使用模拟异步来实现其操作。对于常规文件、套接字、COM(串行)端口等,应提供真正的(操作系统级)异步

我可以想象Boost Asio SSL实现使用这样一个后台线程来模拟与SSL协议相关的一些有状态的事情。您可以查看文档以了解情况是否如此。ª

然而,在一切平等的情况下,你已经拥有了

  • 一些证据表明情况确实如此(除非使用SSL,否则不会出现额外的线程)
  • 找到的方法(只要在“神秘线程”出现时停止程序并检查它们的调用堆栈即可)

在相关说明中,线程用于管理计时器,例如../detail/impl/win_iocp_io_service.ipp

更新正如OP所发现的,这条线索正好位于:


@Anno Woot!那张截图很有说服力,我会把它添加到答案中。