gpt4 book ai didi

c++ - 使用多个 boost::asio::deadline_timer

转载 作者:太空宇宙 更新时间:2023-11-04 13:23:49 25 4
gpt4 key购买 nike

<分区>

假设我们有一个运行多个网络客户端的应用程序,它形成一个循环:发送一个请求,然后暂停指定的时间,然后再次。

示例(不是所有代码):

#define WAIT_INTERVAL 1000

class client()
{
public:
explicit client(boost::asio::io_service & io_service)
: io_service_(io_service)
{
working_ = true;
};

run(boost::asio::yield_context t_yield)
{
while (working_) {
// async wait
boost::asio::deadline_timer timer(io_service_, boost::posix::milliseconds(WAIT_INTERVAL));

timer.async_wait(t_yield);

do_work();
}
};

private:
void do_work()
{
// make work
}

bool working_{ false };
boost::asio::io_service & io_service_;
}

class app()
{
public:
// code omitted

prepare(size_t number_of_clients)
{
clients_.reserve(number_of_clients);

for (size_t i = 0; i < number_of_clients; ++i)
{
clients_.emplace_back(io_service_);
}
}

run()
{
for (auto & client : clients_)
{
boost::asio::spawn(io_service_, [&client](boost::asio::yield_context t_yield)
{
client.run(t_yield);
});
}
}

private:
boost::asio::io_service io_service_;
std::vector<client> clients_;
}

问题是:当运行许多客户端(比如 100 个左右)时,deadline_timer 实际上会等待几秒钟,不是接近 1000 毫秒,而是大约 9000 毫秒甚至更多。

如何避免这种情况或如何重写程序以便每个客户端等待给定的等待间隔加减一些小差异?

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