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?
我有一个 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?