BOOST_LOG_SEV портит async_read_some после создания потока

Итак, я практиковался в библиотеке повышения и кое-что застрял. Мое приложение использовало asio::serial_port, и я решил добавить некоторые функции журнала. И тут возникает проблема.

Когда я создаю поток для asio::io_service

boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service_));

а затем попробуйте записать что-нибудь с помощью

BOOST_LOG_SEV(MBLog::get(), logging::trivial::trace) << "something to trace;"

прежде чем звонить

port_->async_read_some(
        boost::asio::buffer(read_buf_raw_, SERIAL_PORT_READ_BUF_SIZE),
        boost::bind(
            &SerialPort::on_receive_,
            this, boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred));

то обработчик on_receive_ никогда не вызывается (порт все равно может написать что-то с write_some thow). Когда макрос ведения журнала закомментирован или выполнен после выполнения async_read_some, он волшебным образом работает. Я хотел бы знать, что за магия стоит за этим или где начать искать ответ? Может быть, кто-то из вас уже знает проблему, поделитесь, пожалуйста. Другая полезная информация:

Я использую MSVC2017.

Инициализация журнала Boost

Logger.h

#define _HAS_AUTO_PTR_ETC 1
#include <boost/log/trivial.hpp>
#include <boost/log/sources/global_logger_storage.hpp>

namespace logging = boost::log;
namespace src = boost::log::sources;
namespace sinks = boost::log::sinks;
namespace keywords = boost::log::keywords;
namespace attrs = boost::log::attributes;
namespace expr = boost::log::expressions;

BOOST_LOG_GLOBAL_LOGGER(MBLog, src::severity_logger_mt<logging::trivial::severity_level>)

Logger.cpp

#include "Logger.h"

#include <boost/log/support/date_time.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/console.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>

void full_detail_formatter(logging::record_view const& rec, logging::formatting_ostream& strm);

void normal_formatter(logging::record_view const& rec, logging::formatting_ostream& strm);

BOOST_LOG_GLOBAL_LOGGER_INIT(MBLog, src::severity_logger_mt<logging::trivial::severity_level>)
{
    src::severity_logger_mt<logging::trivial::severity_level> lg;

    logging::add_common_attributes();

    auto file_sink = logging::add_file_log(
        keywords::file_name = "./logs/L%Y-%m-%d_%3N.log", // one file per date and execution
        keywords::rotation_size = 5 * 1024 * 1024,      // rotate after 5MB
        keywords::target = "./logs",
        keywords::min_free_space = 30 * 1024 * 1024,
        keywords::auto_flush = true,
        keywords::scan_method = boost::log::sinks::file::scan_matching
    );

    file_sink->set_formatter(&full_detail_formatter);
    file_sink->set_filter(
        logging::trivial::severity >= logging::trivial::trace
    );

    auto console_sink = logging::add_console_log(std::clog);
    console_sink->set_formatter(&full_detail_formatter);
    console_sink->set_filter(
        logging::trivial::severity >= logging::trivial::trace
    );

    logging::core::get()->set_filter(
        logging::trivial::severity >= logging::trivial::trace
    );

    return lg;
}

ИЗМЕНИТЬ

Похоже, кто-то уже решил эту проблему здесь создав поток для asio::io_service::run после выполнения async_read_some


person Patryk Koziel    schedule 19.03.2018    source источник


Ответы (1)


Кажется, кто-то уже решил эту проблему здесь, создав поток для asio::io_service::run после выполнения async_read_some

Да. В противном случае run() может завершиться до того, как какая-либо работа будет зарегистрирована.

Документация по этому поводу находится здесь: http://www.boost.org/doc/libs/1_65_0/doc/html/boost_asio/reference/io_service/run/overload1.html

Функция run() блокируется до тех пор, пока не завершится вся работа и не останется обработчиков для отправки, или пока не будет остановлен io_service.

Дополнительные пояснения можно найти:

Рассмотрите возможность сохранения службы с io_service::work: ">Boost asio post не работает, io_service::run завершает работу сразу после публикации

person sehe    schedule 19.03.2018