gpt4 book ai didi

c++ - boost::asio::io_service 定时器和帖子占用的队列长度

转载 作者:可可西里 更新时间:2023-11-01 15:24:40 26 4
gpt4 key购买 nike

我是 boost::asio 的新手,但我正在从事一个已经存在几年并广泛使用 asio 的项目。我目前的任务是添加关于系统正在做的各种事情的定期指标。其中一项指标是观察 boost::asio::io_service 工作队列和定时器队列在任意运行时间段的深度。所以我需要能够询问 boost:asio::io_service 对象它的队列中有多少东西。

为了说明我的要求,请考虑以下内容:

boost::asio::io_service asio_service;

asio_service.post( boost::bind( do_work, "eat" ) );
asio_service.post( boost::bind( do_work, "drink" ) );
asio_service.post( boost::bind( do_work, "and be merry!" ) );

std::cout << "There are " << asio_service.XXXX()
<< "things in the post() queue and "
<< asio_service.YYYY() << " timers"

boost asio 有没有办法获得与我的“XXXX()”和“YYYY()”调用所表达的功能等效的功能?

我查看了 asio 计时器队列代码,发现队列实际上只是一个 vector 和一个列表,但两者都是私有(private)的。由于它们是私有(private)的,我无法通过继承来获得访问权限,而且我不想继承或编写某种古怪的访问者模式来为这对指标总结一下:直接访问这些计数将是理想的;我破解的特殊版本的 boost 并不理想:我正在寻找一种已经存在于 boost 中的方法来做到这一点。希望我不是第一个提出这个要求的人。

最佳答案

如果不直接修改 asio 库,则无法获取有关 io_service 队列的统计信息。正如您所注意到的,容器是私有(private)的。无论如何,队列的大小实际上并不是非常重要,因为性能或吞吐量取决于完成处理程序。我过去为解决类似问题所做的工作是测量将普通处理程序发布到 io_service

所需的时间
void
Status::impl()
{
const boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time();
_io_service.post(
boost::bind(
&Status::loadHandler,
this,
start
)
);
}

void
Status::loadHandler(
const boost::posix_time::ptime& start,
)
{
// calculate duration spent in reactor queue
const boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time();
const boost::posix_time::time_duration load = end - start;
}

关于c++ - boost::asio::io_service 定时器和帖子占用的队列长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6803458/

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