我希望有一种方法可以在多个线程中添加异步任务,并在c ++ boost :: asio应用程序中按顺序执行它们。
更新:我想在它们之间只有一个持久套接字进行服务器到服务器的通信,我需要通过它对多个请求进行排序。它需要将传入的请求保留在队列中,触发最高的请求/等待响应并接收下一个请求。我试图避免使用zeromq因为它需要一个专用线程。
Update2:好的,这是我最终的结果:并发工作线程被“排队”以使用带有简单互斥的服务器到服务器套接字。通信阻止写入/等待响应/读取然后释放互斥锁。简单不是它:))
答案 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的好处是增加同时为多个请求提供服务的服务器的可伸缩性。