【发布时间】:2020-02-03 22:25:01
【问题描述】:
我想实现服务器的单线程终止,允许继续执行 其他线程的操作(接受、读取、写入)。 我应该为每个线程使用自己的接受器对象吗? 是否存在 api 功能或者我应该实现套接字注册,我将在哪里标记,哪个套接字属于线程? 目前,我实现了该线程的循环:
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);
}
【问题讨论】:
-
您是否正在尝试实现每个客户端都有自己的线程来处理该客户端的接受/读/写仅的解决方案,或者您是否可以接受一个线程能够处理来自多个客户端的请求?
-
我的解决方案是几个线程和每个线程中的几个客户端。
标签: c++ boost-asio