目录

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线程池实现分析相关推荐

  1. JAVA线程池的分析和使用

    1. 引言 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行.第三:提 ...

  2. java 线程池原理分析

    一.为什么使用线程池 1.降低资源消耗,减少线程创建和销毁次数,每个工作线程可以重复利用,执行多个任务 2.可根据系统承受能力,调整工作线程的数目,防止消耗过多的内存 二.java 线程池使用 Exe ...

  3. 聊聊并发(三)——JAVA线程池的分析和使用

    1. 引言 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行.第三:提 ...

  4. JAVA线程池的分析和使用--笔记

    1. 引言 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行.第三:提 ...

  5. java线程池饱和策略_干货:Java几种线程池的分析和使用。

    原标题:干货:Java几种线程池的分析和使用. 利用线程池的优势: 1.降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 2.提高响应速度.当任务到达时,任务可以不需要等到线程创建 ...

  6. java并发包线程池原理分析锁的深度化

    java并发包&线程池原理分析&锁的深度化 并发包 同步容器类 Vector与ArrayList区别 1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素 ...

  7. Tomcat线程池监控及线程池原理分析

      目录         一.背景         二.tomcat线程池监控         三.tomcat线程池原理         四.总结 一.背景 我们都知道稳定性.高可用对于一个系统来讲 ...

  8. Java-Java中的线程池原理分析及使用

    文章目录 概述 线程池的优点 线程池的实现原理 线程池的使用 创建线程池 向线程池中提交任务 关闭线程池 合理的配置线程池 线程池的监控 概述 我们在上篇博文 Java-多线程框架Executor解读 ...

  9. 【5】线程池原理分析

    目录 知识点1:并发包 1.(计数器)CountDownLatch 2.(屏障)CyclicBarrier 3.(计数信号量)Semaphore (1)案例 4.并发队列 5.阻塞队列与非阻塞队 (1 ...

最新文章

  1. Ubuntu关闭ipv6
  2. Qt Creator将UI项目转换为应用程序
  3. 疯狂android源码中文乱码无gbk,我的Android进阶之旅------Android使用cmd窗口进行adb logcat时出现中文乱码问题的解决办法...
  4. Javascript面向对象编程(二) 构造函数的继承
  5. 502 Bad Gateway Registered endpoint failed to handle the request
  6. 传感与检测技术,Pt100热电阻测温实验报告,江南大学物联网
  7. LeetCode 739. 每日温度(单调栈)
  8. 做形态学方法的团队_图像分割实战-分水岭分割方法和GrabCut 算法
  9. python3正式发布时间_Python3 日期和时间
  10. WCF 第十二章 对等网 System.Net.PeerToPeer.Collaboration
  11. WinForm中的一种死锁场景
  12. redhat7配置本地yum源
  13. 大数据毕设/课设 - 基于大数据的可视化分析模板
  14. 微观经济学 读书笔记
  15. Air720UGUH 极简封装 LTE Cat.1 bis 模块[合宙通信]
  16. 职称论文发表教育期刊《中小学教育》杂志简介及投稿须知
  17. python里value是什么意思_关于Python 字典里的value
  18. 记-----租房七大注意事项
  19. 升降压斩波电路matlab,升降压斩波电路matlab仿真
  20. access口 环路_交换机二层环路问题处理指南[苍松参考]

热门文章

  1. html5横幅添加搜索,html5 – 为什么我的“添加到主屏幕”Web应用程序安装横幅未显示在我的网络应用程序中...
  2. python print打印設置字體顔色
  3. 大话西游各服务器位置,大话西游手游时间服哪个区好_大话西游手游时间服哪个服务器人多_玩游戏网...
  4. 16 OAuth2登录流程分析
  5. 使用Excel时截图的一个小技巧
  6. android 老人手机排行榜,2019老年手机排行榜_老年手机排行榜
  7. 「连锁餐饮行业热点快报」复工首日上海咖啡外卖订单暴增210%
  8. 神卓互联内网穿透:打通内外网络,实现高效办公
  9. 扇贝单词增强脚本 Shanbay-Enhance
  10. 一路向西,挑战暴风雪,骑车回家过年(多图)