一个独立的线程函数示例
一个独立的线程函数示例
#ifndef __PUSH_CACHE_THREAD_H__ #define __PUSH_CACHE_THREAD_H__ #include "util/tc_singleton.h" #include "util/tc_thread.h" #include "util/tc_config.h" //taf::TC_Config #include "util/tc_thread_rwlock.h" #include <vector> #include <string> #include "PushInterface.h" #include "PushCache.h" class CPushCacheThread :public taf::TC_Thread , public taf::TC_Singleton<CPushCacheThread> { public: CPushCacheThread(); ~CPushCacheThread(); bool initialize(const taf::TC_Config &conf); void run(); void terminate(); public: void pushToCache(const HQExtend::HPushUserMsgReq& oneMsg); private: std::queue<HQExtend::HPushUserMsgReq> m_msgQue; taf::TC_ThreadLock m_ThreadLock;//线程锁 taf::TC_ThreadRWLocker m_rwLock;//读写锁 HQExtend::PushCachePrx m_pushCachePrx; std::vector<std::string> m_vObjName; }; #endif
#include "pushCacheThread.h" #include "CountTimeApp.h" //TELL_TIME_COST_THIS #include "servant/Application.h" //ServerConfig::LocalIp #include "servant/taf_logger.h" //FDLOG #include "Pusher.h" using namespace std; CPushCacheThread::CPushCacheThread() { FDLOG("debug") << __FILE__ << ":" << __LINE__ << ":" << __func__ << "|" << std::this_thread::get_id() << endl; } CPushCacheThread::~CPushCacheThread() { FDLOG("debug") << __FILE__ << ":" << __LINE__ << ":" << __func__ << "|" << std::this_thread::get_id() << endl; terminate(); } bool CPushCacheThread::initialize(const taf::TC_Config &conf) { bool bRet = false; try { string pushCacheObj = conf.get("/conf/push<pushCache>"); if (!pushCacheObj.empty()) { //预警历史缓存服务 接口 m_pushCachePrx = Communicator::getInstance()->stringToProxy<HQExtend::PushCachePrx>(pushCacheObj); FDLOG("debug") << __FILE__ << ":" << __LINE__ << ":" << __func__ << "|" << "Push Cache prx init succ " << endl; bRet = true; } return bRet; } catch (std::exception &ex) { LOG_ERROR << "Exception: " << ex.what() << endl; } catch (...) { LOG_ERROR << "Unkonwn exception" << endl; } return bRet; } void CPushCacheThread::run() { FDLOG("cast") << __FILE__ << ":" << __LINE__ << ":" << __func__ << "|" << " =========== run START =========== " << std::this_thread::get_id() << endl; while (_running) { try { // do nothing... std::queue<HQExtend::HPushUserMsgReq> tempMsgQue; { taf::TC_ThreadWLock wlock(m_rwLock); tempMsgQue.swap(m_msgQue); } while (tempMsgQue.size() > 0) { HQExtend::HPushUserMsgReq req = tempMsgQue.front(); HQExtend::PushCachePrxCallbackPtr callback(new PushCacheCallback()); m_pushCachePrx->async_pushUserMsg(callback, req); tempMsgQue.pop(); } { TC_ThreadLock::Lock lock(m_ThreadLock); m_ThreadLock.timedWait(5000); } } catch (std::exception &ex) { LOG_ERROR << "Exception:" << ex.what() << endl; } catch (...) { LOG_ERROR << "Unkown exception." << endl; } } FDLOG("cast") << __FILE__ << ":" << __LINE__ << ":" << __func__ << "|" << " =========== run END =========== " << std::this_thread::get_id() << endl; } void CPushCacheThread::terminate() { FDLOG("cast") << __FILE__ << ":" << __LINE__ << ":" << __func__ << "|" << " =========== terminate =========== " << std::this_thread::get_id() << endl; if (_running) { _running = false; try { TC_ThreadLock::Lock lock(m_ThreadLock); m_ThreadLock.notifyAll(); LOG_DEBUG << __FILE__ << " CPushCacheThread::terminate " << endl; } catch (std::exception &ex) { LOG_ERROR << __FILE__ << "Exception:" << ex.what() << endl; } catch (...) { LOG_ERROR << __FILE__ << "Unknown exception." << endl; } } } void CPushCacheThread::pushToCache(const HQExtend::HPushUserMsgReq &oneMsg) { taf::TC_ThreadWLock wlock(m_rwLock); m_msgQue.push(oneMsg); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?