基于多反应堆的高并发服务器【C/C++/Reactor】(中)线程池的启动和从线程池中取出一个反应堆实例

本文主要是介绍基于多反应堆的高并发服务器【C/C++/Reactor】(中)线程池的启动和从线程池中取出一个反应堆实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、线程池的启动 

// 启动线程池
void threadPoolRun(struct ThreadPool* pool) {assert(pool && !pool->isStart);if(pool->mainLoop->threadID != pthread_self()) {exit(0);}pool->isStart = true;if(pool->threadNum) {for(int i=0;i<pool->threadNum;++i) {workerThreadInit(&pool->workerThreads[i], i);workerThreadRun(&pool->workerThreads[i]);}}
}

## 学习笔记:线程池的运行机制

  • 线程池被创建后,需要启动使其子线程运行。启动线程池的函数需要一个有效struct ThreadPool*类型指针pool作为参数,和threadNum代表子线程总个数
// 初始化线程池
struct ThreadPool* threadPoolInit(struct EventLoop* mainLoop, int threadNum);
  • 确保线程池未运行且执行线程为主线程
// 确保线程池未运行
assert(pool && !pool->isStart);
// 比较主线程的ID和当前线程ID是否相等 
// 相等=>确保执行线程为主线程;不相等=>exit(0)
if(pool->mainLoop->threadID != pthread_self()) {exit(0);
}

  

  1. 如果条件满足,将线程池标记为已启动,并初始化并启动子线程
  2. 如果线程数量大于零,通过WorkerThread模块的workerThreadInit函数进行初始化,通过WorkerThread模块的workerThreadRun函数进行启动
pool->isStart = true; // 标记为启动
if(pool->threadNum) { // 线程数量大于零for(int i=0;i<pool->threadNum;++i) {workerThreadInit(&pool->workerThreads[i], i);// 初始化子线程workerThreadRun(&pool->workerThreads[i]); // 启动子线程}
}

### 知识点:线程池的启动

- 启动线程池的函数需要确保传入的结构体指针有效且线程池未运行

- 执行线程需要判断是否为主线程,避免异常情况

- 成功启动后,需要初始化并启动子线程,通过WorkerThread模块的函数进行初始化和启动

二、从线程池中取出一个反应堆实例

此外,takeWorkerEventLoop函数可以从线程池中取出某个子线程的反应堆实例

// 取出线程池中的某个子线程的反应堆实例
struct EventLoop* takeWorkerEventLoop(struct ThreadPool* pool) {assert(pool->isStart);if(pool->mainLoop->threadID != pthread_self()) {exit(0);}// 从线程池中找到一个子线程,然后取出里边的反应堆实例struct EventLoop* evLoop = pool->mainLoop; if(pool->threadNum > 0) {evLoop = pool->workerThreads[pool->index].evLoop;pool->index = ++pool->index % pool->threadNum;}return evLoop;
}

如果线程数量为零,线程池可以提供一个事件循环的反应堆模型(mainLoop),即:

evLoop=pool->mainLoop;

如果线程数量大于零,从线程池中的当前工作线程获取其事件循环,并将其存储在evLoop变量中。为了对线程池中的工作线程实现雨露均沾,故需要用到index这个变量,为了确保 pool->index  的值在合适的取值范围内并且不会超出它的取值范围:先将 pool->index  的值加一,然后对 pool->threadNum取余数,并将结果赋值给 pool->index 

if(pool->threadNum > 0) {evLoop = pool->workerThreads[pool->index].evLoop;pool->index = ++pool->index % pool->threadNum;
}

 ### 知识点:子线程的反应堆实例的取出

- 可以通过takeWorkerEventLoop函数从线程池中取出子线程的反应堆实例

- 这个函数的核心是取出反应堆实例,用于处理任务

- 如果线程数量为零,线程池可以提供一个事件循环的反应堆模型(mainLoop)

- 对线程池中的工作线程实现雨露均沾,用到index这个变量

未完待续~

这篇关于基于多反应堆的高并发服务器【C/C++/Reactor】(中)线程池的启动和从线程池中取出一个反应堆实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/568395

相关文章

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性: