线程主循环主要工作内容:1. 从ASIO库的全局队列获取任务执行;2. 判断本线程是否比较”闲”,如果是则直接销毁退出 。3. 线程创建起来进行初始线程名设置、线程主循环一些计数处理等 。
3.2.3控制线程核心代码实现
控制线程用于判断线程池是线程是否压力很大,是否比较”忙”,如果是则增加线程数来减轻全局队列中task 任务积压引起的延迟处理问题 。控制线程核心代码实现如下:
1. //controller控制线程2. void ServiceExecutorAdaptive::_controllerThreadRoutine() {3.//控制线程线程名设置4.setThreadName("worker-controller"_sd);5.......6.//控制线程主循环7.while (()) {8.//一次while结束的时候执行对应func ,也就是结束的时候计算为起始时间9.const auto timerResetGuard =10.MakeGuard([&sinceLastControlRound] { (); });11.//等待工作线程通知,最多等待stuckThreadTimeout12.(fakeLk, _config->stuckThreadTimeout().toSystemDuration());13.......14.double utilizationPct;15.{16.//获取所有线程执行任务的总时间17.auto spentExecuting = _getThreadTimerTotal(ThreadTimer::Executing);18.//获取所有线程整个生命周期时间(包括空闲时间+执行任务时间+创建线程的时间)19.auto spentRunning = _getThreadTimerTotal(ThreadTimer::Running);20.//也就是while中执行一次这个过程中spentExecuting差值,21.//也就是spentExecuting代表while一次循环的Executing time开始值,22.//lastSpentExecuting代表一次循环对应的结束time值23.auto diffExecuting = spentExecuting - lastSpentExecuting;24.//也就是spentRunning代表while一次循环的running time开始值,25.//lastSpentRunning代表一次循环对应的结束time值26.auto diffRunning = spentRunning - lastSpentRunning;27.if (spentRunning == 0 || diffRunning == 0)28.utilizationPct =29.else {30.lastSpentExecuting = spentExecuting;31.lastSpentRunning = spentRunning;32.33.//一次while循环过程中所有线程执行任务的时间和线程运行总时间的比值34.utilizationPct = diffExecuting / static_cast
- 模糊pid和神经网络pid对比,基于神经网络的PID控制
- Demigod设计师的崛起
- UE4改变摄像机的距离
- 关于小神龙大功夫的介绍 小神龙大功夫
- python简单绘图教程视频_python 简单的绘图工具turtle使用详解
- 工业设计:点石成金的“金手指”
- 敖厂长的真名是什么?
- 地栽桔子树怎么养
- 葱兰种植密度?
- UWB和GPS人员定位调研