Mam*_*rot 2 c++ boost boost-asio
我可以在同步读取线程的不同线程中关闭tcp :: 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并接受多线程吗?
该文档声明tcp::socket对共享对象不是线程安全的.
不要指望它似乎可以保证它始终有效.
此外,在套接字层从另一个线程关闭套接字不是一种使阻塞线程解除阻塞的可移植方式.
这是我的建议:
引用作者的类似问题:
其实...
在实践中,它可能适用于asio目前支持的平台**.但是,我故意指定了接口,使其不是线程安全的.这是为了允许实现在套接字对象中存储其他状态而无需显式同步.
如果要在同一个套接字上运行多个并发操作,安全,可移植的方法是使用异步操作.
**除非你使套接字无阻塞.
干杯,克里斯
| 归档时间: |
|
| 查看次数: |
1616 次 |
| 最近记录: |