c++ - 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));
}
解决方案
推荐阅读
- php - 获取控制器中的删除ID以删除mysql记录
- oracle - 对正确日期 + 小时:分钟的一点帮助,例如 Oracle for Postgresql
- angular - 'p-table' 不是已知元素:
- github - 无法转移 github 存储库,因为 fork 同名
- mysql - 计算只有整数值mysql的行
- javascript - 如何使用 Webpack CLI 指定输出文件名?
- c++ - C/C++ 中是否有预定义的算术运算的 2D 点?
- pandas - 如何根据熊猫中的其他列添加新列?
- linux - 在各种操作系统中,为什么关闭 shell 窗口会中断在该 shell 中运行的代码?
- javascript - 为什么我的堆排序功能没有按预期工作?