io_context.reset 内部会把 stopped_ 变量设置成 0,也就是没有 stop 的意思。
等到 io_context.run 判断的时候就不会返回。
#include <thread>
#include <boost/asio.hpp>
#include <boost/asio/io_context.hpp>
#include <iostream>
#include <memory>
#include <Windows.h>
using namespace std;
using namespace boost;
namespace net = boost::asio;
using boost::asio::ip::tcp;
net::io_context ioc;
net::io_context::work work(ioc);
thread g_thread;
void foo();
void bar()
{
cout << "bar before sleep" << endl; // 当打印这行后,立刻按 Ctrl+C
this_thread::sleep_for(3s);
cout << "bar after sleep" << endl;
ioc.reset();
tcp::socket s(ioc);
tcp::endpoint ep(boost::asio::ip::address_v4::from_string("127.0.0.1"), 9999);
s.async_connect(ep, [](const boost::system::error_code& error) {
cout << "connect callback error: " << error << endl;
ioc.post(foo);
});
}
void foo()
{
// 如果换成 thread 调用 bar,io_context 就可以退出。
//thread t([]() {
// bar();
//});
//t.detach();
bar();
}
void io_thread()
{
ioc.run();
cout << "after ioc.run" << endl;
}
BOOL WINAPI CtrlHandler(DWORD fdwCtrlType)
{
ioc.stop();
cout << "ios stop" << endl;
g_thread.join();
return FALSE;
}
int main(int argc, char* argv[])
{
SetConsoleCtrlHandler(CtrlHandler, TRUE);
g_thread = thread(io_thread);
ioc.post(foo);
//for (;;)
//{
// this_thread::sleep_for(10s);
//}
//this_thread::sleep_for(10s);
//ioc.stop();
//cout << "ioc stop" << endl;
//this_thread::sleep_for(30s);
return 0;
}
在 bar 函数中,当输出 bar before sleep 的时候,按下 Ctrl+C,那么 io_context 拥有不会 stop。因为 bar 函数紧接着会调用 io_context.reset。
但是如果把 foo 函数中调用 bar 换成 thread 方式。那么用上边同样的流程,io_context 会正常停下来。还不知道什么原因,具体原因有待研究。
win10 x64 boost 1.70.0