【问题标题】:Boost Thread dies before job finishedBoost Thread 在工作完成之前就死掉了
【发布时间】:2011-07-23 07:36:58
【问题描述】:

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

【问题讨论】:

  • 贴出tcp_server类的定义。我也不清楚为什么需要一个单独的线程来运行 io_service。

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


【解决方案1】:

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

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

该错误与线程无关,而是称为“returning the address of a local”的常见错误类型的一个实例(即使您实际上并未在此处返回它,但机制是相同的)。

解决方案是通过手动控制 (new/delete) 或增加它(例如,使其成为 server 上的类成员而不是local 在构造函数中)。

server 变量似乎也有问题,它也是一个局部变量,一旦构造函数存在就会被销毁。由于您实际上根本没有使用它,因此您发布的代码不是问题,但无论如何这表明您正在做一些可疑的事情。

【讨论】:

  • 谢谢,我发现我在这里遗漏了一些非常重要的东西。
【解决方案2】:

您的io_service 需要使用一些io_service::work 来做准备,无论是明确的还是来自您的tcp_server 对象。否则io_service::run() 将立即返回控制权。研究asio examples,理解这个概念很重要。

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

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

我怀疑您的代码是一个人为的示例,它可能不需要线程来运行 io_service。主线程就可以了。

【讨论】:

    猜你喜欢
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多