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