int n=10的sizeof 为什么是四_mongodb内核源码实现、性能调优( 三 )

_config;37.//线程列表及其对应的锁38.mutable stdx::mutex _threadsMutex;39.ThreadList _threads;40.//控制线程41.stdx::thread _controllerThread;42.43.//TransportLayerManager::createWithConfig赋值调用44.//时间嘀嗒处理45.TickSource* const _tickSource;46.//运行状态47.AtomicWord _isRunning{false};48.//kThreadsRunning代表已经执行过task的线程总数,也就是这些线程不是刚刚创建起来的49.AtomicWord _threadsRunning{0};50.//代表当前刚创建或者正在启动的线程总数,也就是创建起来还没有执行task的线程数51.AtomicWord _threadsPending{0};52.//当前正在执行task的线程53.AtomicWord _threadsInUse{0};54.//当前入队还没执行的task数55.AtomicWord _tasksQueued{0};56.//当前入队还没执行的deferredTask数57.AtomicWord _deferredTasksQueued{0};58.//TransportLayerManager::createWithConfig赋值调用59.//没什么实际作用60.TickTimer _lastScheduleTimer;61.//记录这个退出的线程生命期内执行任务的总时间62.AtomicWord _pastThreadsSpentExecuting{0};63.//记录这个退出的线程生命期内运行的总时间(包括等待IO及运行IO任务的时间)64.AtomicWord _pastThreadsSpentRunning{0};65.//完成线程级的统计66.static thread_local ThreadState* _localThreadState;67.68.//总的入队任务数69.AtomicWord _totalQueued{0};70.//总执行的任务数71.AtomicWord _totalExecuted{0};72.//从任务被调度入队,到真正被执行这段过程的时间,也就是等待被调度的时间73.AtomicWord _totalSpentQueued{0};74.75.//shutdown的时候等待线程消耗的条件变量76.stdx::condition_variable _deathCondition;77.//条件变量,如果发现工作线程压力大,为了避免task饥饿78.//通知controler线程,通知见ServiceExecutorAdaptive::schedule,等待见_controllerThreadRoutine79.stdx::condition_variable _scheduleCondition;80. };
ive 类核心成员变量及其功能说明如下:
从上面的成员变量列表看出,队列、线程这两个大类可以进一步细化为不同的小类,如下:
1)线程: 、、
2)队列: 、、
从上面的ive 类中的核心接口函数代码实现可以归纳为如下三类:
1)时间计数相关核心代码实现
2) 工作线程创建及任务调度相关核心接口代码实现
3) 控制线程设计原理及核心代码实现
.1 线程运行时间计算相关核心代码实现
线程运行时间计算核心算法如下:
1. //线程运行时间统计,包含两种类型时间统计2. enum class ThreadTimer3. {4.//线程执行task任务的时间+等待数据的时间5.Running,6.//只包含线程执行task任务的时间7.Executing8. };9.10. //线程私有统计信息,记录该线程运行时间,运行时间分为两种:11. //1. 执行task任务的时间 2. 如果没有客户端请求,线程就会等待,这就是线程等待时间12. struct ThreadState {13.//构造初始化14.ThreadState(TickSource* ts) : running(ts), executing(ts) {}15.//线程一次循环处理的时间,包括IO等待和执行对应网络事件对应task的时间16.CumulativeTickTimer running;17.//线程一次循环处理中执行task任务的时间,也就是真正工作的时间18.CumulativeTickTimer executing;19.//递归深度20.int recursionDepth = 0;21. };22. 23. //获取指定which类型的工作线程相关运行时间,24. //例如Running代表线程总运行时间(等待数据+任务处理)25. //Executing只包含执行task任务的时间26. TickSource::Tick ServiceExecutorAdaptive::_getThreadTimerTotal(ThreadTimer which) const {27.//获取一个时间嘀嗒tick28.TickSource::Tick accumulator;29.//先把已消耗的线程的数据统计出来30.switch (which) {31.//获取生命周期已经结束的线程执行任务的总时间(只包括执行任务的时间)32.case ThreadTimer::Running:33.accumulator = ();34.break;35.//获取生命周期已经结束的线程整个生命周期时间(包括空闲时间+执行任务时间)36.case ThreadTimer::Executing:37.accumulator = ();38.break;39.}40.//然后再把统计当前正在运行的worker线程的不同类型的统计时间统计出来41.stdx::lock_guard lk(_threadsMutex);42.for (auto& thread : _threads) {43.switch (which) {44.//获取当前线程池中所有工作线程执行任务时间45.case ThreadTimer::Running:46.accumulator += ();47.break;48.//获取当前线程池中所有工作线程整个生命周期时间(包括空闲时间+执行任务时间)49.case ThreadTimer::Executing:50.accumulator += ();51.break;52.}53.}54.//返回的时间计算包含了已销毁的线程和当前正在运行的线程的相关统计55.return accumulator;56. }