同时调用 ASIO 对象的 API 是否安全?
Is it safe to call APIs of ASIO objects concurrently?
我是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()
的后台线程调用它?
如果是这样,是否有一些文档?我宁愿不依赖于未记录的实现细节。
查看线程安全保证,每个类都记录了这些保证,但也记录了一般 https://www.boost.org/doc/libs/1_71_0/doc/html/boost_asio/overview/core/threads.html
这证实了:
问。我可以假设套接字保护它的内部状态,即使我从不调用 io_service.run(( 的后台线程调用它吗?
不,你不能假设,因为它没有"保护它的内部状态",你可能的意思是:它不同步对它的访问。
此外,从运行io_service
处理程序的多个线程进行访问并不意味着它是安全的。您可能需要strands
(隐式或显式(来确保这一点。
- 如何检查第三个 API 是否在 Linux 中为 c/c++ 程序创建了一个新线程?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- API 返回智能指针的 std::optional 以明确指定指针可能为 null 是否有意义?
- 同时调用 ASIO 对象的 API 是否安全?
- 使用通常称为 API 实现C++多个客户和生产者解决方案,这是否有效?
- 是否有可以在iOS上运行的API来更改现有视频的每秒帧数?
- 如果我公开常量和非常量 API,我是否破坏了常量正确性?
- 张量流 c++ API 是否支持反向传播的自动微分?
- Microsoft加密 API 是否允许从字节流创建 ECDSA 密钥?
- 如何检查 CNG Windows API 是否返回符合 FIPS 的算法实现
- 在 Android NDK 中使用比 Android 清单中最低 API 更高的 API 是否有效?
- system.speech api 是否支持 c++ 语言进行开发
- 通过Delphi访问Windows API是否会导致性能损失
- wchar_t对Windows API是否有用
- Windows GDI API是否在GetLastError中返回错误代码
- python C API是否与C++完全兼容
- SendNotifyMessage API 是否跨用户会话工作
- COM(C++)对于AddRef和Release中的Thread Saftey来说,互锁API是否足够
- RapidXML API是否可以增加缓冲区
- Windows加密api是否故意运行较慢,并将调试器附加到进程中