作业结束前,Boost Thread死亡

Kon*_*che 2 c++ multithreading boost boost-thread boost-asio

我正在使用boost库来实现套接字通信.对于我的主应用程序,应启动一个处理所有传入请求的连接处理程序.

因此,我将整个服务器处理程序封装到类服务器中.创建服务器对象时,它应该启动服务器.

但是这样线程就会与构造函数代码的执行结束一起死掉.我想我不知道boost/posix线程是如何工作的.我来自Java背景.

server::server(int port) {

try {
    boost::asio::io_service io_service;
    tcp_server server(io_service, port);
    boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));
} catch (std::exception& e) {
    std::cerr << e.what() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 5

您正在构建一个局部变量io_service,您将其传递给新线程的worker函数.当变量超出范围(构造函数退出)时,将io_service被销毁并且无法再访问.

但是,您的线程的worker函数不知道这一点,并且可能会尝试再次访问该对象的剩余部分.随之而来的是丑闻.

该错误与线程无关,但是是一个常见错误类型的实例,称为" 返回本地地址 "(即使您实际上没有在此处返回它,机制也是相同的).

解决方案io_service是通过手动控制(new/ delete)或通过增加它来延长对象的生命周期(例如,使其成为类成员server而不是构造函数中的本地成员).

您似乎也遇到了server变量问题,该变量也是本地变量,并且只要构造函数存在就会被销毁.由于你实际上并没有使用它,这对你发布的代码来说不是问题,但无论如何它表明你正在做一些可疑的事情.