2011-07-29 126 views
8

如何通过strand在socket上执行async_ *操作?我看了Timer.5(Boost/Asio示例),但它们只显示如何调用用户的处理程序。当我在async_write多线程应用程序数据中的套接字可能被写入损坏。并且strand保证这些处理程序都不会同时执行。boost :: asio socket async_ * strand

+1

你有什么特别的问题?当使用“strand”与“_not_”使用“strand”时,执行异步操作时不会显着不同。只需将你的处理程序包装在链中。 – Chad

+0

这个问题目前没有意义,请编辑它并添加一些清晰度。 –

+0

它对我来说非常合适。我有同样的问题。多个线程试图使用单个连接的读/写请求响应,并且都是混乱的。我试图达到的是一个连续的读取请求/做任何需要处理(甚至是对另一个服务的另一个请求/响应),然后将响应返回给原始请求者。 – Roskoto

回答

4

Boost.Asio的文档:

。该io_service :: strand类提供了张贴的能力,并派遣 处理与保证没有这些处理器都将执行 兼任。

strand使用的a good exampleBoost.Asio的例子。

strand保证您的处理程序执行将被同步。这意味着如果您的io_service从多个线程执行,则strand很有用。这与您如何安排任务(处理程序)无关。

strand不能帮助您同时执行多个套接字读取或写入操作,因为内部读取/写入执行不能并发执行,所以应该只有一个活动的读取或写入异步操作。

对于reads您只需拨打async_read即可启动读取顺序,并在消费收到的数据后再次从读取处理程序调用它。与单线程环境中的相同。

对于writes如果有并发生产者(如果多个线程提供要写入到套接字的数据),则需要一个并发队列(例如boost circular buffer,查找“Bounded Buffer Example”)。您的写入函数从此缓冲区获取数据,异步将其写入套接字。您的写入处理程序会调用您的写入功能。

3

当我在async_write()到多线程应用程序数据的套接字 可能被写入损坏。 Strand保证这些处理程序不会同时执行。

如果多个线程需要在套接字上写数据,则必须确保数据的排序。这在async_write()documentation中明确地清楚。

程序必须确保流执行没有其它写 操作(如ASYNC_WRITE,该流的async_write_some 功能,或者执行写操作的任何其它组成的操作),直到此 操作完成。

我建议保持一个传出的消息队列,它非常类似于this question和我的answer

相关问题