Boost:: asio:: io_service занял длину очереди для таймеров и сообщений

Я новичок в 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 и увидел, что очередь - это просто вектор и список, но оба являются частными. Поскольку они являются частными, я не могу наследовать, чтобы получить доступ, и я не хочу наследовать или писать какой-то шаблон посетителя с нечетным шаром, чтобы обернуть все это для одной пары показателей: прямой доступ к этим подсчетам будет идеал; специальные версии boost, которые я взламываю, чтобы дать мне доступ, были бы не идеальными: я ищу способ сделать это, который уже существует в boost. Надеюсь, я не первый, кто попросит об этом.

Ответ 1

Вы не можете получить статистику о очереди io_service, не изменяя непосредственно библиотеку asio. Как вы уже отметили, контейнер является закрытым. Размер очереди действительно не очень важен, так как производительность или пропускная способность зависят от обработчиков завершения. То, что я делал в прошлом, чтобы решить что-то подобное, - это измерить время, необходимое для отправки тривиального обработчика в 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;
}