Я хотел бы реализовать однопоточное завершение работы сервера, позволяющее продолжить выполнение операций (принять, прочитать, записать) для других потоков. Должен ли я использовать собственный объект акцептора для каждого потока? Существует ли API-функциональность для этого или я должен реализовать регистр сокетов, где я буду отмечать, какой сокет принадлежит потоку? В настоящее время я реализую l oop:
void TServer::Process_connections(IThread* _th, TThcode _idx)
{
const char * FUNCTION = __FUNCTION__;
using namespace boost::asio::ip;
using namespace boost::asio;
error_code ec;
LOG + "s: server thread loop is started" << std::to_string(_idx);
//auto m_pthread = m_pmngthread.get();
auto isRunning = _th->isRunning();//m_pthread->isRunning();
while(isRunning)
{
if ((m_state(state::running)))
{
do_accept(_idx);
//m_state << state::run;
break;
}
isRunning = _th->isRunning();
}
while(isRunning)
{
if (m_state(state::run))
{
try
{
m_ioservice.poll(ec);
} catch (...)
{
errspace::show_errmsg(FUNCTION);
m_state << state::shutdowned;
}
if (ec) break;
clearGarbage();
}
isRunning = _th->isRunning();//m_pthread->isRunning();
}
LOG << "s: server thread loop is stopping";
// only for single thread server
m_acceptor.cancel(ec);
if (ec)
{
errspace::show_errmsg("error in acceptor::cancel");
}
// only for single thread server
m_ioservice.run(ec);
if (ec)
{
errspace::show_errmsg("error in ioservice::run");
}
std::unique_lock<std::recursive_mutex> lock(m_mtx_garbage);
std::unique_lock<std::recursive_mutex> lock2(m_mtx_active);
m_socketset_garbage.clear();
m_socketset_active.clear();
// only for single thread server
m_acceptor.close();
if (ec)
{
errspace::show_errmsg("error in acceptor::close");
}
LOG + "s: loop is stopped" << std::to_string(_idx);
}
этого потока