KBengine线程池实现分析
目录
Q:CBE是多线程的吗?可否部署在多台物理机上?
一、线程池线程生成
二、线程回调函数
三、线程池的具体使用
Q:CBE是多线程的吗?可否部署在多台物理机上?
A:CBE采用的是单线程(当然db读写等特殊任务依然会另开临时线程处理)多进程结构,不同的进程可以部署在不同的物理机上。理论上通过扩展机器数量和配置就可以扩展负载规模。
一、线程池线程生成
线程池实现在thread工程的threadpool类内.
由ThreadPool ->实例化 Thread实现
生成指定数量的线程
bool ThreadPool::createThreadPool(uint32 inewThreadCount, uint32 inormalMaxThreadCount, uint32 imaxThreadCount)
{assert(!isInitialize_);INFO_MSG("ThreadPool::createThreadPool: creating threadpool...\n");extraNewAddThreadCount_ = inewThreadCount;normalThreadCount_ = inormalMaxThreadCount;maxThreadCount_ = imaxThreadCount;for(uint32 i=0; i<normalThreadCount_; ++i){TPThread* tptd = createThread(0);if(!tptd){ERROR_MSG("ThreadPool::createThreadPool: error! \n");return false;}currentFreeThreadCount_++; currentThreadCount_++;freeThreadList_.push_back(tptd);allThreadList_.push_back(tptd);}INFO_MSG(fmt::format("ThreadPool::createThreadPool: successfully({0}), ""newThreadCount={1}, normalMaxThreadCount={2}, maxThreadCount={3}\n",currentThreadCount_, extraNewAddThreadCount_, normalThreadCount_, maxThreadCount_));isInitialize_ = true;KBEngine::sleep(100);return true;
}
生成TPThread类对象
TPThread* ThreadPool::createThread(int threadWaitSecond, bool threadStartsImmediately)
{TPThread* tptd = new TPThread();if (threadStartsImmediately)tptd->createThread();return tptd;
}
调用API生成线程,Windows使用_beginthreadex, Linux使用pthread_create
THREAD_ID TPThread::createThread(void)
{
#if KBE_PLATFORM == PLATFORM_WIN32tidp_ = (THREAD_ID)_beginthreadex(NULL, 0, &TPThread::threadFunc, (void*)this, NULL, 0);
#else if(pthread_create(&tidp_, NULL, TPThread::threadFunc, (void*)this)!= 0){ERROR_MSG("createThread error!");}
#endifreturn tidp_;
}
二、线程回调函数
线程回调函数实现,通过参数arg把类指针传递进来
可以看到处理任务都是 tptd->processTask(task);这里
#if KBE_PLATFORM == PLATFORM_WIN32
unsigned __stdcall TPThread::threadFunc(void *arg)
#else
void* TPThread::threadFunc(void* arg)
#endif
{TPThread * tptd = static_cast<TPThread*>(arg);ThreadPool* pThreadPool = tptd->threadPool();bool isRun = true;tptd->reset_done_tasks();#if KBE_PLATFORM == PLATFORM_WIN32
#else pthread_detach(pthread_self());
#endiftptd->onStart();while(isRun){if(tptd->task() != NULL){isRun = true;}else{tptd->reset_done_tasks();isRun = tptd->onWaitCondSignal();}if(!isRun || pThreadPool->isDestroyed()){if(!pThreadPool->hasThread(tptd))tptd = NULL;goto __THREAD_END__;}TPTask * task = tptd->task();if(task == NULL)continue;tptd->state_ = THREAD_STATE_BUSY;while(task && !tptd->threadPool()->isDestroyed()){tptd->inc_done_tasks();tptd->onProcessTaskStart(task);tptd->processTask(task);tptd->onProcessTaskEnd(task);// 尝试继续从任务队列里取出一个繁忙的未处理的任务TPTask * task1 = tptd->tryGetTask();if(!task1){tptd->state_ = THREAD_STATE_PENDING;tptd->onTaskCompleted();break;}else{pThreadPool->addFiniTask(task);task = task1;tptd->task(task1);}}}__THREAD_END__:if(tptd){TPTask * task = tptd->task();if(task){WARNING_MSG(fmt::format("TPThread::threadFunc: task {0:p} not finish, thread.{1:p} will exit.\n", (void*)task, (void*)tptd));delete task;}tptd->onEnd();tptd->state_ = THREAD_STATE_END;tptd->reset_done_tasks();}
通过TPTask,对象传入
virtual void processTask(TPTask* pTask){ pTask->process(); }
通过查看TPTask的知道主要使用线程池的是dbmagr,也就是负责数据库查询的进程,多线程主要是满足进行数据库查询。
线程的堆栈调用顺序
三、线程池的具体使用
查看另一篇《KBEngine,数据库查询消息流程》https://blog.csdn.net/hu123he/article/details/119790150
KBengine线程池实现分析相关推荐
- JAVA线程池的分析和使用
1. 引言 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行.第三:提 ...
- java 线程池原理分析
一.为什么使用线程池 1.降低资源消耗,减少线程创建和销毁次数,每个工作线程可以重复利用,执行多个任务 2.可根据系统承受能力,调整工作线程的数目,防止消耗过多的内存 二.java 线程池使用 Exe ...
- 聊聊并发(三)——JAVA线程池的分析和使用
1. 引言 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行.第三:提 ...
- JAVA线程池的分析和使用--笔记
1. 引言 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行.第三:提 ...
- java线程池饱和策略_干货:Java几种线程池的分析和使用。
原标题:干货:Java几种线程池的分析和使用. 利用线程池的优势: 1.降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 2.提高响应速度.当任务到达时,任务可以不需要等到线程创建 ...
- java并发包线程池原理分析锁的深度化
java并发包&线程池原理分析&锁的深度化 并发包 同步容器类 Vector与ArrayList区别 1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素 ...
- Tomcat线程池监控及线程池原理分析
目录 一.背景 二.tomcat线程池监控 三.tomcat线程池原理 四.总结 一.背景 我们都知道稳定性.高可用对于一个系统来讲 ...
- Java-Java中的线程池原理分析及使用
文章目录 概述 线程池的优点 线程池的实现原理 线程池的使用 创建线程池 向线程池中提交任务 关闭线程池 合理的配置线程池 线程池的监控 概述 我们在上篇博文 Java-多线程框架Executor解读 ...
- 【5】线程池原理分析
目录 知识点1:并发包 1.(计数器)CountDownLatch 2.(屏障)CyclicBarrier 3.(计数信号量)Semaphore (1)案例 4.并发队列 5.阻塞队列与非阻塞队 (1 ...
最新文章
- Ubuntu关闭ipv6
- Qt Creator将UI项目转换为应用程序
- 疯狂android源码中文乱码无gbk,我的Android进阶之旅------Android使用cmd窗口进行adb logcat时出现中文乱码问题的解决办法...
- Javascript面向对象编程(二) 构造函数的继承
- 502 Bad Gateway Registered endpoint failed to handle the request
- 传感与检测技术,Pt100热电阻测温实验报告,江南大学物联网
- LeetCode 739. 每日温度(单调栈)
- 做形态学方法的团队_图像分割实战-分水岭分割方法和GrabCut 算法
- python3正式发布时间_Python3 日期和时间
- WCF 第十二章 对等网 System.Net.PeerToPeer.Collaboration
- WinForm中的一种死锁场景
- redhat7配置本地yum源
- 大数据毕设/课设 - 基于大数据的可视化分析模板
- 微观经济学 读书笔记
- Air720UGUH 极简封装 LTE Cat.1 bis 模块[合宙通信]
- 职称论文发表教育期刊《中小学教育》杂志简介及投稿须知
- python里value是什么意思_关于Python 字典里的value
- 记-----租房七大注意事项
- 升降压斩波电路matlab,升降压斩波电路matlab仿真
- access口 环路_交换机二层环路问题处理指南[苍松参考]
热门文章
- html5横幅添加搜索,html5 – 为什么我的“添加到主屏幕”Web应用程序安装横幅未显示在我的网络应用程序中...
- python print打印設置字體顔色
- 大话西游各服务器位置,大话西游手游时间服哪个区好_大话西游手游时间服哪个服务器人多_玩游戏网...
- 16 OAuth2登录流程分析
- 使用Excel时截图的一个小技巧
- android 老人手机排行榜,2019老年手机排行榜_老年手机排行榜
- 「连锁餐饮行业热点快报」复工首日上海咖啡外卖订单暴增210%
- 神卓互联内网穿透:打通内外网络,实现高效办公
- 扇贝单词增强脚本 Shanbay-Enhance
- 一路向西,挑战暴风雪,骑车回家过年(多图)