[boost.asio]在I/O线程的不同线程中关闭tc​​p :: socket或tcp :: acceptor

Mam*_*rot 2 c++ boost boost-asio

我可以在同步读取线程的不同线程中关闭tc​​p :: socket吗?看起来像:

boost::asio::ip::tcp::socket* tcp_socket;  //blocking mode
Run Code Online (Sandbox Code Playgroud)

线程1:

while(true){
   try{
       std::vector<char> read_buffer(10);
       tcp_socket->read_some( boost::asio::buffer( read_buffer ) );
  }
  catch(boost::system::system_error& e){
  //TODO
  break;
  }
}
Run Code Online (Sandbox Code Playgroud)

线程2:

tcp_socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both);
tcp_socket->close();
Run Code Online (Sandbox Code Playgroud)

我看到了tcp :: socket 的文档.他们说这个对象是线程不健全的.但是演示代码似乎运行良好.那么安全吗?那么tcp :: acceptor呢?我可以在相同的tcp :: acceptor上调用close并接受多线程吗?

Guy*_*ton 5

该文档声明tcp::socket对共享对象不是线程安全的.

不要指望它似乎可以保证它始终有效.

此外,在套接字层从另一个线程关闭套接字不是一种使阻塞线程解除阻塞的可移植方式.

这是我的建议:

  • 使用asio的异步API.
  • 使用互斥锁保护套接字以防止并发访问或使用asio链序列化对它的访问.

引用作者的类似问题:

其实...

在实践中,它可能适用于asio目前支持的平台**.但是,我故意指定了接口,使其不是线程安全的.这是为了允许实现在套接字对象中存储其他状态而无需显式同步.

如果要在同一个套接字上运行多个并发操作,安全,可移植的方法是使用异步操作.

**除非你使套接字无阻塞.

干杯,克里斯