c++ - boost::asio 的线程安全性如何?

标签 c++ boost boost-asio asio

我有一个由多个线程运行的 io_context。我正在使用套接字和计时器。我知道我需要将所有 async_writes 包装成一个链,以防止并发写入套接字。

但是两个线程可以同时访问套接字以同时发出 async_read 和 async_write 吗?

或者当另一个线程调用 async_read 时调用 shutdown() 或 close() 呢?还是在计时器上取消()?

在这种情况下,我是否需要使用互斥锁或链来保护套接字/计时器?

最佳答案

经常有人问和回答:

Thread Safety

In general, it is safe to make concurrent use of distinct objects, but unsafe to make concurrent use of a single object. However, types such as io_context provide a stronger guarantee that it is safe to use a single object concurrently.



所以是的,您需要保护对计时器/套接字对象的主动访问。但是,运行中的异步操作不是问题:它大约是 您的 需要同步的访问。

所以,
 asio::post(strand, [&sock] { sock.shutdown();});

总是安全的,当你只有 1 个线程运行服务时,那么
post(io_context_, [&sock] { sock.shutdown();});

也很好。两者都将安全地取消在 sock 上仍在运行的任何异步操作。 .

另见优秀:Why do I need strand per connection when using boost::asio?

关于c++ - boost::asio 的线程安全性如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61697887/

相关文章:

c++ - 指向数组的指针和指向数组第一个元素的指针之间的区别

c++ - 如何将 asio 与设备文件一起使用

c++ - boost async_read 与阻塞同步线程 - 性能差异?

c++ - 文件 basic_socket.hpp 中的 lib boost asio 1.47.0 出错

c++ - 从逗号分隔的字符串中解析整数

c++ - 如何避免来自继承的属性冗余

c++ - 集合的结构之间的比较

c++ - 有选择地禁用第三方库的 C++ Core Guidelines Checker

c++ - OPERATOR_BRACKET_IS_NOT_SUPPORTED 在 boost::bimap 上

c++ - 使用 boost 的 Glob 风格正则表达式模式匹配