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/pop
B
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