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

How thread-safe is boost::asio?

我有一个 io_context 是 运行 由多个线程。我正在使用套接字和定时器。我知道我需要用一条线包裹所有 async_writes 以防止并发写入套接字。

但是两个线程并发访问socket可以同时发出一个async_read和一个async_write吗?

或者在另一个线程调用 async_read 时调用 shutdown() 或 close() 会怎么样?或者在计时器上取消()?

在这种情况下,我需要用互斥体或链来保护 socket/timer 吗?

这个问题经常被问及回答:

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.

所以是的,您需要保护对 timer/socket 对象的主动访问。但是,运行中的异步操作不是问题:它是关于 您的 访问需要您的同步。

所以,

 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?