2011-11-17 117 views
1

我想有一种方法可以从多个线程添加异步任务,并在C++ boost :: asio应用程序中按顺序执行它们。如何使用C++ boost :: asio按顺序执行异步操作?

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

Update2:好的,下面是我结束了:并发工作线程是“排队”使用服务器到服务器套接字与简单的互斥体。通信阻止写入/等待响应/读取,然后释放互斥锁。简单是吧:)

+1

我也很想拥有这个! –

回答

1

从ASIO documentation

异步完成处理程序将只从 正在调用io_service对象::运行的线程称为()。

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

+0

实际上,链仅对同步任务进行排序。你不能用链对异步任务进行排序。这是一个例子。服务接受请求,并且需要请求辅助服务完成请求。我想一次将请求排序到次要服务的异步请求/异步响应。 – Roskoto

+0

@Roskoto:我不认为这是真的。如果你看一下定时器5的例子,一个链用于同步对两个不同线程中两个不同deadline_timer的async_wait()的调用。当你提到辅助服务时,你是在谈论另一个io_service对象?如果是这样,也许解决方案是使用线程共享的单个io_service对象。那么你应该能够使用一个链来同步你的异步任务。或者我不理解什么? – Sean

+0

我不认为Timer.5就是一个很好的例子。它同时启动两个定时器并仅同步响应。是的,我只有一个io_service在多个线程中运行 – Roskoto

0

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

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

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

+0

该示例仅对请求进行排序而不等待任何响应。 – Roskoto

+0

@Roskoto:“答复”是否意味着对服务器写入的响应?如果是这样,你还可以在写入完成处理程序中启动一个async_read? – Ralf