如何使用c ++ boost :: asio顺序执行异步操作?

时间:2011-11-17 03:48:58

标签: c++ boost

我希望有一种方法可以在多个线程中添加异步任务,并在c ++ boost :: asio应用程序中按顺序执行它们。

更新:我想在它们之间只有一个持久套接字进行服务器到服务器的通信,我需要通过它对多个请求进行排序。它需要将传入的请求保留在队列中,触发最高的请求/等待响应并接收下一个请求。我试图避免使用zeromq因为它需要一个专用线程。

Update2:好的,这是我最终的结果:并发工作线程被“排队”以使用带有简单互斥的服务器到服务器套接字。通信阻止写入/等待响应/读取然后释放互斥锁。简单不是它:))

2 个答案:

答案 0 :(得分:1)

来自ASIO documentation

  

异步完成处理程序只能从那些线程调用   目前正在调用io_service :: run()。

如果您已经从多个线程调用io_service::run(),则可以按here所述的io_service::strand包装异步调用。

答案 1 :(得分:0)

不确定我是否理解正确,但client chat example中的方法有什么问题?消息发布到io_service线程,在写入进行时排队,并在写入完成处理程序中弹出/发送。如果在此期间添加了更多消息,则写入处理程序将启动下一次异步写入。

基于你对Sean的评论,我也不明白让多个线程调用io_service :: run的好处,因为你一次只能在一个持久套接字上执行一个async_write / async_read,即你只能再次调用async_write处理程序返回后?调用线程的数量可能要求您使用互斥锁来锁定队列。

AFAICT让多个线程调用io_service :: run的好处是增加同时为多个请求提供服务的服务器的可伸缩性。