类中的递归函数或竞争条件
A recursive function or race condition inside a Class?
在下面的代码中,私有函数handle_read_content
使用依赖于handle_read_content
的asio::async_read
。这会调用递归行为还是创建竞争条件?
class client
{
public:
//constrcutor, io_service, server name? path?
client(asio::io_service& io_service,
const std::string& server, const std::string& path)
: resolver_(io_service),
socket_(io_service)
{
//form request, connection close header server close the socket
//std:ostream reuest_stream
// Form the request. We specify the "Connection: close" header so that the
// server will close the socket after transmitting the response. This will
// allow us to treat all data up until the EOF as the content.
std::ostream request_stream(&request_);
request_stream << "GET " << path << " HTTP/1.0rn";
request_stream << "Host: " << server << "rn";
request_stream << "Accept: */*rn";
request_stream << "Connection: closernrn";
// Start an asynchronous resolve to translate the server and service names
// into a list of endpoints.
//tcp:resolver:query
tcp::resolver::query query(server, "http");
resolver_.async_resolve(query,
boost::bind(&client::handle_resolve, this,
asio::placeholders::error,
asio::placeholders::iterator));
}
private:
void handle_read_content(const asio::error_code& err)
{
if (!err)
{
// Write all of the data that has been read so far.
std::cout << &response_;
// Continue reading remaining data until EOF.
asio::async_read(socket_, response_,
asio::transfer_at_least(1),
boost::bind(&client::handle_read_content, this,
asio::placeholders::error));
}
else if (err != asio::error::eof)
{
std::cout << "Error: " << err << "n";
}
}
tcp::resolver resolver_;
tcp::socket socket_;
asio::streambuf request_;
asio::streambuf response_;
};
这不是递归的,handle_read_content是一个回调函数,将在async_read操作完成时调用。
http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference/async_read/overload1.html
这就是async_read的工作方式,下面是它正在做的:
- 读取一些数据
- 读取操作完成后,boost调用handle_read_content
- 它调用一个新的async_read。。。然后这个过程又开始了。。。直到出现错误
相关文章:
- compare_exchange C++函数如何确定竞争条件?
- 在C++中写入相同值的竞争条件?
- QByteArray 通过队列连接按值发出并连接并附加到竞争条件?
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 如何修复条件变量等待/通知的竞争条件
- 在没有互斥锁的情况下重新计数时如何避免竞争条件?
- 替代 rand() 以避免竞争条件?
- CUDA 内核中的竞争条件
- 为什么跨线程更改共享变量的代码显然没有受到竞争条件的影响
- 类声明自己(*this)为private以避免竞争条件/放弃在gcc中对threadprivate的请求
- 使用 gtest EXPECT_CALL 时竞争条件段错误,而另一个期望是执行相同的方法
- boost::进程间消息队列创建时的竞争条件
- 如何在没有竞争条件的情况下将 QFutureWatcher 与 QtConcurrent::run() 一起使用
- 为什么 printf 可以屏蔽竞争条件,而系统日志不能?
- 为什么这个代码会产生竞争条件
- 为什么 CUDA 同步点不能阻止竞争条件?
- 竞争条件:一个线程创建静态对象,另一个线程在初始化完成之前使用它.如何处理
- 如何使用 Boost Atomic 删除竞争条件
- boost::mutex 无法帮助避免C++程序中的竞争条件
- 类中的递归函数或竞争条件