作为一个完全的初学者提高。阿西欧,我和 io_service::run()
搞混了。如果有人能向我解释这个方法何时阻塞/解除阻塞,我将不胜感激。文件上写着:
run()
函数会一直阻塞,直到所有工作都完成,没有其他处理程序需要分派,或者直到io_service
已经停止。多个线程可以调用
run()
函数来设置一个线程池,io_service
可以从这个池中执行处理程序。在池中等待的所有线程都是等价的,io_service
可以选择它们中的任何一个来调用处理程序。从
run()
函数正常退出意味着io_service
对象停止(stopped()
函数返回 true)。随后对run()
、run_one()
、poll()
或poll_one()
的呼叫将立即返回,除非事先有对reset()
的呼叫。
下面的陈述是什么意思?
[ ... ]没有更多的管理人员被派遣[ ... ]
在试图理解 io_service::run()
的行为时,我遇到了这个 例子(示例3a)。在其中,我观察到 io_service->run()
阻塞并等待工作命令。
// WorkerThread invines io_service->run()
void WorkerThread(boost::shared_ptr<boost::asio::io_service> io_service);
void CalculateFib(size_t);
boost::shared_ptr<boost::asio::io_service> io_service(
new boost::asio::io_service);
boost::shared_ptr<boost::asio::io_service::work> work(
new boost::asio::io_service::work(*io_service));
// ...
boost::thread_group worker_threads;
for(int x = 0; x < 2; ++x)
{
worker_threads.create_thread(boost::bind(&WorkerThread, io_service));
}
io_service->post( boost::bind(CalculateFib, 3));
io_service->post( boost::bind(CalculateFib, 4));
io_service->post( boost::bind(CalculateFib, 5));
work.reset();
worker_threads.join_all();
但是,在我正在处理的以下代码中,客户机使用 TCP/IP 和 run 方法块进行连接,直到数据被异步接收。
typedef boost::asio::ip::tcp tcp;
boost::shared_ptr<boost::asio::io_service> io_service(
new boost::asio::io_service);
boost::shared_ptr<tcp::socket> socket(new tcp::socket(*io_service));
// Connect to 127.0.0.1:9100.
tcp::resolver resolver(*io_service);
tcp::resolver::query query("127.0.0.1",
boost::lexical_cast< std::string >(9100));
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
socket->connect(endpoint_iterator->endpoint());
// Just blocks here until a message is received.
socket->async_receive(boost::asio::buffer(buf_client, 3000), 0,
ClientReceiveEvent);
io_service->run();
// Write response.
boost::system::error_code ignored_error;
std::cout << "Sending message \n";
boost::asio::write(*socket, boost::asio::buffer("some data"), ignored_error);
如果能在下面的两个例子中解释 run()
的行为,我们将不胜感激。