【发布时间】:2017-06-08 16:14:20
【问题描述】:
我正在阅读boost::asio::io_service::run_one() 并且对功能块的含义感到困惑。什么被阻止了,处理程序在哪里定义?
【问题讨论】:
标签: exception boost boost-asio handler
我正在阅读boost::asio::io_service::run_one() 并且对功能块的含义感到困惑。什么被阻止了,处理程序在哪里定义?
【问题讨论】:
标签: exception boost boost-asio handler
我正在阅读 boost::asio::io_service::run_one() 并且对功能块的含义感到困惑。什么被屏蔽了
阻塞意味着run_one() 阻塞,直到它完成一个处理程序。
处理程序在哪里定义?
不是。 Logically it's described in the documentation。处理程序是服务中待处理的任何操作。所以,如果你这样做:
void foo() { /*.... */ }
void bar() { /*.... */ }
io_service svc;
svc.post(foo);
svc.post(bar);
现在是你第一次打电话
svc.run_one();
阻塞直到foo 完成。第二次
svc.run_one();
将阻塞直到bar 完成。之后,run_one() 将不会阻塞,只会返回 0。如果您让服务保持不变,例如:
io_service::work keep_around(svc);
svc.run_one();
在发布其他操作之前会阻止。
【讨论】:
run*() 和poll*() 总是在所有工作完成后返回。 work 是一项“人造”工作,可以防止这种情况发生。它与答案本质上无关,只是添加,因为它表明run_one() 可以无限期阻塞,而不仅仅是运行特定任务的时间。