标签:pos 基础 time 解决 timeout 假设 The void 复杂
大部分使用Boost.Asio编写的代码都会使用几个io_service的实例。io_service是这个库里面最重要的类;它负责和操作系统打交道,等待所有异步操作的结束,然后为每一个异步操作调用其完成处理程序。
你有多种不同的方式来使用io_service。在下面的3个例子中,我们有3个异步操作,2个socket连接操作和一个计时器等待操作。为了解释它们之间的不同点,我们假设:过一会操作1完成,然后接着操作2完成。同时我们假设每一个完成处理程序需要1秒钟来完成执行。
一个io_service实例和一个处理线程的单线程:
io_service service; // 所有socket操作都由service来处理 ip::tcp::socket sock1(service); // all the socket operations are handled by service ip::tcp::socket sock2(service); sock1.asyncconnect( ep, connect_handler); sock2.async_connect( ep, connect_handler); deadline_timer t(service, boost::posixtime::seconds(5)); t.async_wait(timeout_handler); service.run();
我们在一个线程中等待三个操作全部完成,第1个操作一完成,我们就调用它的完成处理程序。尽管操作2紧接着完成了,但是操作2的完成处理程序需要在1秒钟后,也就是操作1的完成处理程序完成时才会被调用。
一个io_service实例和多个处理线程的多线程:
io_service service; ip::tcp::socket sock1(service); ip::tcp::socket sock2(service); sock1.asyncconnect( ep, connect_handler); sock2.async_connect( ep, connect_handler); deadline_timer t(service, boost::posixtime::seconds(5)); t.async_wait(timeout_handler); for ( int i = 0; i < 5; ++i) boost::thread( run_service); void run_service() { service.run(); }
我们在两个线程中等待3个异步操作结束。当操作1完成时,我们在第1个线程中调用它的完成处理程序。当操作2完成时,紧接着,我们就在第2个线程中调用它的完成处理程序(当线程1在忙着响应操作1的处理程序时,线程2空闲着并且可以回应任何新进来的操作)。
多个io_service实例和多个处理线程的多线程:
io_service service[2]; ip::tcp::socket sock1(service[0]); ip::tcp::socket sock2(service[1]); sock1.asyncconnect( ep, connect_handler); sock2.async_connect( ep, connect_handler); deadline_timer t(service[0], boost::posixtime::seconds(5)); t.async_wait(timeout_handler); for ( int i = 0; i < 2; ++i) boost::thread( boost::bind(run_service, i)); void run_service(int idx) { service[idx].run(); }
因为操作1是sock1的connect,操作2是sock2的connect,所以应用程序会表现得像第二个例子一样。线程1会处理sock1 connect操作的完成处理程序,线程2会处理sock2的connect操作的完成处理程序。然而,如果sock1的connect操作是操作1,deadline_timer t的超时操作是操作2,线程1会结束正在处理的sock1 connect操作的完成处理程序。因而,deadline_timer t的超时操作必须等sock1 connect操作的完成处理程序结束(等待1秒钟),因为线程1要处理sock1的连接处理程序和t的超时处理程序。
注意不能拥有多个io_service实例却只有一个线程。下面的代码片段没有任何意义:
for ( int i = 0; i < 2; ++i) service[i].run();
因为service[1].run()需要service[0].run()先结束。因此,所有由service[1]处理的异步操作都需要等待,这显然不是一个好主意。
下面是需要从前面的例子中学到的:
标签:pos 基础 time 解决 timeout 假设 The void 复杂
原文地址:https://www.cnblogs.com/zhanghu52030/p/9188258.html