C++11 通过post和分派将任务(处理程序)放入taskqueue的顺序
输出为:C++11 通过post和分派将任务(处理程序)放入taskqueue的顺序,c++11,boost-asio,C++11,Boost Asio,输出为: Handler A Handler B Handler D Handler E Handler C 鉴于 post()将处理程序放入taskqueue并立即返回 如果主线程已经调用run(),dispatch()可以立即运行任务(情况就是这样) 那么 为什么在B和D之前没有运行“Handler E”?它是dispatch(),并且主线程毕竟已经运行io_上下文 为什么最后运行“处理程序C”?这有点道理,因为这是一个帖子中的帖子。但是,将任务放入taskqueue的顺序仍然不是很
Handler A
Handler B
Handler D
Handler E
Handler C
鉴于
- post()将处理程序放入taskqueue并立即返回
- 如果主线程已经调用run(),dispatch()可以立即运行任务(情况就是这样)
- 为什么在B和D之前没有运行“Handler E”?它是dispatch(),并且主线程毕竟已经运行io_上下文
- 为什么最后运行“处理程序C”?这有点道理,因为这是一个帖子中的帖子。但是,将任务放入taskqueue的顺序仍然不是很清楚
intmain()
{
boost::asio::io_服务io_服务;
io_service.dispatch([](){cout这里一切正常
在当前代码中,您调用io\u service.run()
作为最后一条语句。因此post
/dispatch
的所有调用都是等效的,这意味着将处理程序放入队列并立即返回
在run
方法中调用完成处理程序
dispatch
仅当run
在调用dispatch
时起作用时,才可以在不排队的情况下调用处理程序,这不是您的情况
具体情况如下:
dispatch(A) // queue: A
post(B) // queue: A,B
post(D) // queue: A,B,D
dispatch(E) // queue: A,B,D,E
run() was invoked, now completion handlers can be called
pop A
pop B -> in here, C is pushed, so queue is: D,E,C
pop D
pop E
pop C
如果要让dispatch
在不排队的情况下调用处理程序,则必须在后台线程中启动run
,然后才能放入任何任务:
boost::asio::io_service io_service;
boost::asio::io_service::work work{io_service};
std::thread th([&](){ io_service.run(); }); // run started
io_service.dispatch( [](){ cout << "Handler A\n"; } );
// ...
th.join(); // we are waiting here forever
boost::asio::io_服务io_服务;
boost::asio::io_服务::工作{io_服务};
std::thread th([&](){io_service.run();});//运行已启动
io_服务.dispatch([](){谢谢,你对taskqueue解释得很好。如果你能多说一点就好了:1)看起来io_服务::工作在这里不是真的必要(它只是让io_服务保持忙碌?)2)当你启动一个新线程来运行io_服务时。“处理程序E”现在期望立即运行而不排队,即它应该在B,D之前运行-但实际运行仍然显示E在B,D之后。原因是什么?[1]是的,io_服务::run
挂起,您需要删除work
实例以让run
结束(work
可以通过智能指针创建到堆上,然后重置它)。[2] 不,您需要记住,当调用post
时,它会将处理程序推入队列,但run
已经在运行,所以为什么在调度E
之前不运行take/popB
,D
任务并执行它们呢?——这里是从队列弹出之间的一场竞赛(B
,D
)并调用E
。
boost::asio::io_service io_service;
boost::asio::io_service::work work{io_service};
std::thread th([&](){ io_service.run(); }); // run started
io_service.dispatch( [](){ cout << "Handler A\n"; } );
// ...
th.join(); // we are waiting here forever