gpt4 book ai didi

c++ - 我什么时候必须使用 boost::asio:strand

转载 作者:可可西里 更新时间:2023-11-01 18:08:06 25 4
gpt4 key购买 nike

看了boost::asio的文档,还是不清楚什么时候需要用asio::strand。假设我有一个使用 io_service 的线程,那么按如下方式在套接字上写入是否安全?

void Connection::write(boost::shared_ptr<string> msg)
{
_io_service.post(boost::bind(&Connection::_do_write,this,msg));
}

void Connection::_do_write(boost::shared_ptr<string> msg)
{
if(_write_in_progress)
{
_msg_queue.push_back(msg);
}
else
{
_write_in_progress=true;
boost::asio::async_write(_socket, boost::asio::buffer(*(msg.get())),
boost::bind(&Connection::_handle_write,this,
boost::asio::placeholders::error));
}
}

void Connection::_handle_write(boost::system::error_code const &error)
{
if(!error)
{
if(!_msg_queue.empty())
{
boost::shared_ptr<string> msg=_msg_queue.front();
_msg_queue.pop_front();
boost::asio::async_write(_socket, boost::asio::buffer(*(msg.get())),
boost::bind(&Connection::_handle_write,this,
boost::asio::placeholders::error));
}
else
{
_write_in_progress=false;
}
}
}

多线程调用 Connection::write(..) 还是我必须使用 asio::strand ?

最佳答案

简短回答:不,在这种情况下您不必使用 strand

广泛地简化,io_service 包含一个函数对象(处理程序)列表。当在服务上调用 post() 时,处理程序被放入列表中。例如每当异步操作完成时,处理程序及其参数都会放入列表中。 io_service::run() 一个接一个地执行处理程序。因此,如果像您的情况一样只有一个线程调用 run(),则不会出现同步问题,也不需要 strand
只有当多个线程在同一个io_service上调用run()时,才会同时执行多个处理程序,在N个线程中最多有N个并发处理程序。如果这是一个问题,例如如果队列中可能同时有两个处理程序访问同一个对象,则需要 strand
您可以将 strand 视为一组处理程序的一种锁。如果线程执行与 strand 关联的处理程序,则该 strand 将被锁定,并在处理程序完成后释放。任何其他线程只能执行与锁定的 strand 无关的处理程序。

注意:这个解释可能过于简单化并且在技术上不准确,但它给出了 io_service 中发生的事情的基本概念和 strand 的。

关于c++ - 我什么时候必须使用 boost::asio:strand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16397540/

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