作业结束前,Boost Thread死亡

时间:2011-03-26 00:58:33

标签: c++ multithreading boost boost-asio boost-thread

我正在使用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;
}

2 个答案:

答案 0 :(得分:5)

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

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

错误与线程没有关系,但是是一个名为“returning the address of a local”的常见错误类型的实例(即使你实际上没有在这里返回它,机制是相同的)。

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

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

答案 1 :(得分:0)

您的io_service需要通过明确或io_service::work对象的某些tcp_server来做准备。否则io_service::run()将立即返回控制。研究asio examples,这个概念很重要。

  

工作类用于通知   工作开始时的io_service和   饰面。这确保了   io_service对象的run()函数   工作正在进行时不会退出,   并且当没有时它会退出   尚未完成的工作。

     

工作类是可复制构造的   这样它就可以用作数据   处理程序类中的成员。它不是   分配

我怀疑你的代码是一个人为的例子,它可能不需要一个线程来运行io_service。主线程会很好。