如何通过strand在socket上执行async_ *操作?我看了Timer.5(Boost/Asio示例),但它们只显示如何调用用户的处理程序。当我在async_write
多线程应用程序数据中的套接字可能被写入损坏。并且strand
保证这些处理程序都不会同时执行。boost :: asio socket async_ * strand
8
A
回答
4
从Boost.Asio的文档:
。该io_service :: strand类提供了张贴的能力,并派遣 处理与保证没有这些处理器都将执行 兼任。
有strand
使用的a good example在Boost.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。
相关问题
- 1. boost :: asio :: strand && boost :: lockfree :: spsc_queue
- 2. boost :: asio :: strand post方法的性能
- 3. Boost ASIO socket io_service.run blocking
- 4. boost :: asio convert socket to secure
- 5. boost :: asio和socket拥有
- 6. 修改boost :: asio :: socket :: set_option
- 7. 正确使用asio :: io_service :: strand?
- 8. 在boost :: asio的背景下,术语“strand”的隐喻是什么?
- 9. C++ boost asio tcp socket读取旧数据
- 10. 使用boost :: asio :: ip :: tcp :: socket作为shared_ptr
- 11. 使用boost :: asio监听两个socket
- 12. unget bytes to boost :: asio :: ip :: tcp :: socket
- 13. 从不同线程写入boost :: asio socket
- 14. BOOST ASIO使用
- 15. 使用boost :: asio :: ip :: tcp :: socket :: cancel()和socket :: close()
- 16. boost :: asio :: async_read和boost :: asio :: streambuf
- 17. asio .async_ *将不会运行,除非主线程调用io_service.run
- 18. boost asio服务器挂起在调用关闭boost :: socket
- 19. Boost asio set_option error
- 20. boost boost :: asio
- 21. Boost Asio message_flags
- 22. ASIO strand :: wrap是否不必序列化?
- 23. 这些是async_ *函数的boost :: asio lib并行执行操作系统
- 24. 是否保证boost :: asio中的async_ *的处理程序总是会被调用?
- 25. 的boost :: ASIO检查
- 26. boost :: asio通过SocketCAN
- 27. boost :: asio :: async_read_until问题
- 28. boost :: asio:“strand”类型的同步原语是否有任何名称?
- 29. 在Ubuntu 11.04上升压:: asio :: strand断了(boost_all_dev 1.42)
- 30. C++ Boost :: Thread&Boost :: ASIO内存泄漏
你有什么特别的问题?当使用“strand”与“_not_”使用“strand”时,执行异步操作时不会显着不同。只需将你的处理程序包装在链中。 – Chad
这个问题目前没有意义,请编辑它并添加一些清晰度。 –
它对我来说非常合适。我有同样的问题。多个线程试图使用单个连接的读/写请求响应,并且都是混乱的。我试图达到的是一个连续的读取请求/做任何需要处理(甚至是对另一个服务的另一个请求/响应),然后将响应返回给原始请求者。 – Roskoto