【发布时间】:2016-03-05 13:04:50
【问题描述】:
我是 Boost C++ 新手,使用它来编写类似服务器的应用程序,我想知道是否可以同时使用 boost::asio::ip::tcp::socket::async_read_some(...) 和 boost::asio::ip::tcp::socket::write_some(...)。
在我的场景中,Connection 对象通过以下方式连续监听:
void Connection::doRead()
{
auto self(shared_from_this());
socket_.async_read_some(boost::asio::buffer(data_rx_, max_length),
[this, self](boost::system::error_code ec, std::size_t length)
{
if (!ec)
{
afterReading(length);
doRead();
}
});
}
同时,异步函数回调(在不同的线程中运行)可以在 Connection 正在“读取”时调用 socket_.read_write。
我阅读了各种 Boost::Asio 文档,但从未涉及过这种情况。
这是允许的吗?如果没有,应该怎么做才能避免?
编辑:
按照建议,我已经阅读了各种答案,包括:Why do I need strand per connection when using boost::asio?,但仍然找不到答案,因为未指定混合异步和同步(由不同线程调用)调用是否安全。
【问题讨论】:
-
这个answer 可能会有所帮助。
-
@TannerSansbury 是对的,我认为这可能只是作为副本关闭。您需要使用 strands,而且在客户端没有在听,而是在忙着写的时候写信给客户端肯定没有任何意义。
-
好吧,我阅读了答案,但找不到我的问题的答案。据说异步操作在从同一个线程启动时是线程安全的,而同步即使从 2 个不同的线程启动也可能是安全的(答案的注释 1)。没有提到混合异步和同步调用。所以我不认为这是重复的。
标签: c++ sockets boost boost-asio