我有一个由多个线程运行的 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/