我正在使用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;
}
答案 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。主线程会很好。