У меня есть пул соединений, который использует новый thread_pool с 2 потоками.У меня также есть 2 соединения в моем бассейне.Пул соединений реализован так:
.hpp
/// \brief Connection pool.
struct pool : public std::enable_shared_from_this<pool> {
pool(const pool &) = delete;
auto operator=(const pool &) -> pool & = delete;
explicit pool(pool_parameters config, db_parameters params) noexcept;
~pool();
/// \brief Run loop.
asio::io_context m_io_context;
/// \brief Used to keep the io_context from running out of work.
asio::executor_work_guard<asio::io_context::executor_type> m_work_guard;
/// \brief Thread pool where tasks are asynchronously executed.
asio::thread_pool m_workers;
/// \brief Container to hold connections.
std::vector<std::unique_ptr<dbc::connection>> m_connections;
};
.cpp
pool::pool(pool_parameters config, db_parameters params) noexcept
: m_config{std::move(config)},
m_params{std::move(params)},
m_work_guard{asio::make_work_guard(m_io_context)},
m_workers{m_config.thread_pool_size} {
m_connections.reserve(m_config.connection_pool_size);
asio::post(m_workers, [&]() { m_io_context.run(); });
}
pool::~pool() {
std::cerr << "~pool" << std::endl;
m_work_guard.reset();
m_workers.join();
m_io_context.stop();
}
У меня тоже естьобъект соединения, который выполняет установление соединения в конструкторе и установление соединения в деструкторе.
Проблема заключается в том, что к тому времени, когда соединение разрушено, пул уже остановил защиту работы, поэтому пакеты не отправляются.к удаленной системе.
Как заставить принудительное рукопожатие выполнить до того, как защитный щиток разрушен?Я могу добавить метод ручного отключения для каждого объекта подключения, но я бы хотел придерживаться RAII.