首页 > 解决方案 > boost asio示例中的多线程问题

问题描述

我正在开发一个 tcp 服务,我从 boost asio 中举了一个例子来开始(https://www.boost.org/doc/libs/1_73_0/doc/html/boost_asio/example/cpp11/chat/chat_server.cpp ),据我所知,我担心一些事情,任何时候你想发送一些东西,你必须使用发送函数来检查write_msgs_队列的状态并运行一些操作(在我的代码中write_msgs_是一个队列基于 std::byte 的结构):

  void deliver(const chat_message& msg)
  {
    bool write_in_progress = !write_msgs_.empty();
    write_msgs_.push_back(msg);
    if (!write_in_progress)
    {
      do_write();
    }
  }

在 do_write() 函数中,您将看到一个包装了 lambda 函数的异步调用:

void do_write()
  {
    auto self(shared_from_this());
    boost::asio::async_write(socket_,
        boost::asio::buffer(write_msgs_.front().data(),
          write_msgs_.front().length()),
        [this, self](boost::system::error_code ec, std::size_t /*length*/)
        {
          if (!ec)
          {
            write_msgs_.pop_front();
            if (!write_msgs_.empty())
            {
              do_write();
            }
          }
          else
          {
            room_.leave(shared_from_this());
          }
        });
  }

呼叫不断发送消息,直到队列为空。

现在,据我了解, boost::asio::async_write 使 lambda 函数线程安全,但是,由于write_msgs_可以在交付函数中使用,该函数超出了io_context给出的隔离,因此需要互斥锁。现在,我应该在每次使用 write_queue 时放置一个互斥锁,还是使用boost::asio::post()调用传递函数以将write_msgs_与异步调用隔离开来更便宜?

像这样的东西:

boost::asio::io_service srvc; // this somewhere 
void deliver2(const chat_message &msg)
{
   srvc.post(std::bind(&chat_session::deliver,this,msg)); 
}

标签: c++asynchronousboostasio

解决方案


推荐阅读