为什么在这个简单的类中,如果我直接使用 io.run(),则会调用该函数,否则如果要求运行到其他线程,则不会调用print?
#include <iostream>
#include <boost/thread.hpp>
#include <boost/asio.hpp>
using namespace std;
class test
{
public:
test()
{
io.post(boost::bind(&test::print, this));
//io.run();
t = boost::thread(boost::bind(&boost::asio::io_service::run, &io));
}
void print()
{
cout << "test..." << endl;
}
private:
boost::thread t;
boost::asio::io_service io;
};
int main()
{
test();
return 0;
}
答案 0 :(得分:1)
io_service :: run()将完成所有未完成的任务,并在完成后返回。如果你不打电话,它什么都不做。如果您这样做:
boost::asio::io_service::work work(io);
另一个线程将为您执行此操作并运行,直到您以某种方式停止它。
答案 1 :(得分:1)
在允许io_service
完全运行之前,线程对象正在被销毁。 thread
析构函数documentation表示:
[...]程序员必须确保在线程仍可连接时永远不会执行析构函数。
如果定义了BOOST_THREAD_PROVIDES_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE
,程序将在线程析构函数调用std::terminate()
时中止。
如果io_service
应该运行完成,那么考虑加入Test
的析构函数中的线程。以下是demonstrates在线程完成时同步的完整示例:
#include <iostream>
#include <boost/asio.hpp>
#include <boost/thread.hpp>
class test
{
public:
test()
{
io.post(boost::bind(&test::print, this));
t = boost::thread(boost::bind(&boost::asio::io_service::run, &io));
}
~test()
{
if (t.joinable())
t.join();
}
void print()
{
std::cout << "test..." << std::endl;
}
private:
boost::thread t;
boost::asio::io_service io;
};
int main()
{
test();
return 0;
}
输出:
test...