gpt4 book ai didi

c++ - 一起使用 Boost::Asio 套接字异步和同步操作

转载 作者:太空狗 更新时间:2023-10-29 21:38:56 26 4
gpt4 key购买 nike

我是 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进入细节,但总而言之,多个线程同时进行调用是不安全的,异常(exception)如果操作系统支持,多个同步调用可能是安全的。如果一个线程在一个socket上发起异步操作,而另一个线程在同一个socket上执行同步操作,则属于前一种情况,是不安全的。

最优雅的解决方案是避免混契约(Contract)步和异步操作。

  • 如果使用同步操作并且操作系统不支持并发同步操作,则执行显式锁定,例如使用互斥锁。
  • 如果使用异步操作和多线程,则使用显式 strand以防止并发调用处理程序。

此外,通过利用 Boost.Asio 对 futures 的支持,可以同步阻塞等待异步操作完成。 .这种方法允许向用户公开同步阻塞 API,但在内部使用异步操作。启动操作 (async_*) 需要在链中调用,如果调用者不在链的上下文中运行,则需要使用某种形式的同步来允许调用方等待 Asio 创建 future 对象。

关于c++ - 一起使用 Boost::Asio 套接字异步和同步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34023271/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com