boost :: asio socket async_ * strand

时间:2011-07-29 10:56:19

标签: sockets boost asynchronous boost-asio

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

2 个答案:

答案 0 :(得分:4)

来自 Boost.Asio 文档:

  

io_service :: strand类提供发布和分派的功能   处理程序,保证这些处理程序都不会执行   同时进行。

Boost.Asio 示例中strand使用了strand

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

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

对于async_read,您只需调用writes即可启动读取序列,并在使用接收到的数据后再次从读取处理程序中调用它。与您在单线程环境中执行的操作相同。

对于{{1}}如果存在并发生成器(如果多个线程提供要写入套接字的数据),则需要并发队列(例如a good example),查找“有界缓冲区示例”)。您的写入函数从此缓冲区获取数据,异步将其写入套接字。你的写处理程序调用你的写函数。

答案 1 :(得分:3)

  

当我async_write()到多线程应用程序数据中的套接字时   可能写得已损坏。斯特兰德保证不会那些   处理程序将同时执行。

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

  

程序必须确保流不执行其他写操作   操作(例如async_write,流的async_write_some   函数或执行写入的任何其他组合操作直到   此操作完成。

我建议维护一个传出的邮件队列,这与this question和我的answer非常相似。