【发布时间】:2020-03-30 19:37:05
【问题描述】:
我是 ASIO 的新手,想了解线程安全的工作原理,以便弄清楚在使用 ASIO API 时可以做出哪些假设。
到目前为止我发现了什么:
多个线程可以运行io_service.run()。
因此,可能会调用 socket 等类中的处理程序
来自不同的线程,但只能来自执行io_service.run()的线程。
假设socket 有一些必须保护的内部状态
来自并发访问。
socket 将使用strand 包装其处理程序,这将执行序列化
的处理程序。它与在每个
处理程序,但性能更好。
但是socket也有公共方法,比如socket.async_write_some()。它
也可以从不同的线程调用。
假设socket.async_write_some() 访问相同的内部状态,
所以需要一些保护机制。
公共方法如何以安全的方式访问内部状态?
strand可以用来序列化公共方法的调用吗?在公共方法中调用
post([]{ /* actual implementation of the method goes here */})?在链之外使用互斥锁?
在调用公共 API 时我可以做出哪些假设?
我可以假设socket 保护它的内部状态,即使我从不调用io_service.run() 的后台线程调用它?
如果是这样,是否有相关文档?我宁愿不依赖未记录的实现细节。
【问题讨论】:
标签: c++ boost-asio