【发布时间】:2015-02-21 22:18:58
【问题描述】:
以嵌套或递归方式(即从处理程序中)调用 asio::io_service::poll() 或 poll_one() 是否有效?
一个非常基本的测试似乎暗示这可行(我只在一个平台上完成了测试)但我想确保从处理程序中再次调用 poll() 被认为是有效的行为。
我在 asio 文档中找不到任何相关信息,所以我希望对 asio 内部工作有更多经验的人可以通过解释或参考来验证这一点。
基本测试:
struct NestedHandler
{
NestedHandler(std::string name, asio::io_service * service) :
name(name),
service(service)
{
// empty
}
void operator()()
{
std::cout << " { ";
std::cout << name;
std::cout << " ...calling poll again... ";
service->poll();
std::cout << " } ";
}
std::string name;
asio::io_service * service;
};
struct DefaultHandler
{
DefaultHandler(std::string name) :
name(name)
{
// empty
}
void operator()()
{
std::cout << " { ";
std::cout << name;
std::cout << " } ";
}
std::string name;
};
int main()
{
asio::io_service service;
service.post(NestedHandler("N",&service));
service.post(DefaultHandler("A"));
service.post(DefaultHandler("B"));
service.post(DefaultHandler("C"));
service.post(DefaultHandler("D"));
std::cout << "asio poll" << std::endl;
service.poll();
return 0;
}
// Output:
asio poll
{ N ...calling poll again... { A } { B } { C } { D } }
【问题讨论】:
-
虽然它应该是安全的(只有
run()有限制),但它的用法对我来说有点尴尬。有这个用例吗? -
@TannerSansbury 你认为调度有影响吗?
-
@sehe 应该不会影响线程级调度。在某些情况下,它可以改变调用处理程序的顺序。
标签: c++ boost-asio