#ifndef HGL_NETWORK_SOCKET_MANAGE_THREAD_INCLUDE #define HGL_NETWORK_SOCKET_MANAGE_THREAD_INCLUDE #include #include #include namespace hgl { namespace network { /** * 简单的Socket管理器线程 */ template class SocketManageThread:public Thread { public: using AcceptSocketList=List; ///<工作对象列表定义 protected: SocketManage *sock_manage; protected: SemSwapData join_list; ///<待添加的Socket对象列表 SemSwapData unjoin_list; ///<待移出的Socket对象列表 virtual void OnSocketClear(USER_ACCEPT *us){delete us;} /// void ClearAcceptSocketList(ST &sl) { const int count=sl.GetCount(); USER_ACCEPT **us=sl.GetData(); for(int i=0;iJoin(us);} ///<单个工作对象接入处理函数 virtual bool Unjoin(USER_ACCEPT *us){return sock_manage->Unjoin(us);} ///<单个工作对象退出处理函数 /** *处理要接入的工作对象列表 */ void ProcJoinList() { AcceptSocketList &usl=join_list.GetReceive(); const int count=usl.GetCount(); USER_ACCEPT **us=usl.GetData(); for(int i=0;iClear(); //unjoin_list中的理论上都已经在wo_list/join_list里了,所以不需要走Clear,直接清空列表 unjoin_list.GetReceive().ClearData(); unjoin_list.Swap(); unjoin_list.GetReceive().ClearData(); } virtual bool Execute() override { if(join_list.TrySemSwap()) ProcJoinList(); if(unjoin_list.TrySemSwap()) ProcUnjoinList(); sock_manage->Update(0.1); //这里写0.1秒,只是为了不卡住主轮循。这是个错误的设计,未来要将epoll(recv)完全独立一个线程跑 const auto &error_set=sock_manage->GetErrorSocketSet(); USER_ACCEPT **us=(USER_ACCEPT **)error_set.GetData(); for(int i=0;i class SocketManageThread:public Thread }//namespace network }//namespace hgl #endif//HGL_NETWORK_SOCKET_MANAGE_THREAD_INCLUDE