在使用asio和C ++ 11接受或接收时,优先停止阻塞或非阻塞的线程

我使用asio的tcp服务器,我也打算使用C ++ 11标准的线程。 我的最终目标是在Linux上安装此应用程序,但是我首先使用Visual Studio 2015在Windows上进行testing。

首先,我正在使用阻塞,所以我发现有关于如何阻止等待接受的线程的讨论。 有一些C ++ 11之前的解决scheme,例如pipe和select。 我正在寻找asio的方式。

asio::io_service io_service; tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 13)); backAcceptor = &acceptor; tcp::socket socket(io_service); asio::error_code ec; acceptor.accept(socket, &ec); 

第二种方法是使用asynchronous,但我更喜欢只使用asio头。 编译方面抱怨说,asio ::占位符没有这个成员,但根据注释,解决scheme被应用:

  asio::async_write(socket_, asio::buffer(message_), std::bind(&tcp_connection::handle_write, shared_from_this(), std::placeholders::_1, std::placeholders::_2 )); 

run()仍然在那里阻塞。 而我正在寻找方法从主恢复这个线程。

  asio::io_service io_service; tcp_server server(io_service); io_service.run(); 

第三种方法是,在这里设置一个超时。 但是这并不能阻止我的接受。 另外,答案是在2012年。我希望现在有新的解决办法。

更新

为了testing场景,我首先有一个线程来阻塞同步accept()或asynchronousrun()。 当线程正在运行时,主要等待2秒钟,并尝试停止线程。 然后我等待线程完成使用连接。

对于第一个方法“同步”,我试图使用acceptor.cancel()和线程到达连接。 这是正确的方法吗?

第二种方法“asynchronous”,虽然我还不清楚如何正式停止这个线程,我成功地使用io_service.stop()来实际取消它。

请让我知道我的解决scheme是否正确,我将继续尝试不同的解决scheme。

我碰巧用了run_one并且没有线程的非典型方法,特别是允许你暂停个别的“非同步”操作:

  • boost :: asio + std :: future – 关闭套接字后访问冲突

事实上,你可以发布异步操作,但是你await_operation以超时的方式调用await_operation

 async_connect(socket, ip::tcp::resolver(ioservice).resolve({address, port}), raise()); await_socket(std::chrono::seconds(6)); 

这相当于做同步connect 有可能超时。 没有线程,阻止run()或其他小狗被伤害。

查看演示的链接答案


PS。 使用deadline_timerposix_time如果你不希望posix_timestd::chrono posix_time很好地工作