基于多反应堆的高并发服务器【C/C++/Reactor】(中)在EventLoop的任务队列中添加新任务

  1. 任务队列是一个链表,每个节点包含channel类型文件描述符操作类型
  2. 在添加节点时,需要考虑线程同步,并确保节点被正确地添加到链表中
  3. 节点的操作可以写到另一个函数中,以便于程序的维护。
  4. 在添加任务节点时,需要加互斥锁,因为有可能是当前线程主线程进行添加操作。

本文主要介绍了在dispatcher中的处理流程,包括线程同步以及节点的添加和操作。其中,任务队列是一个链表,每个节点包含channel类型、文件描述符和操作类型。在添加节点时,需要考虑线程同步,并确保节点被正确地添加到链表中。

  • EventLoop.h
// 添加任务到任务队列
int eventLoopAddTask(struct EventLoop* evLoop,struct Channel* channel,int type);
  • EventLoop.c

(1) 为什么在上面添加链表节点的时候需要加互斥锁

  • 因为有可能是当前线程去添加,也有可能是主线程去添加。

(2) 如果当前的线程是主线程,那么我们能够让主线程进行节点的处理

  • 肯定不能,因为你当前主线程它只能负责和客户端建立连接,如果这个连接建立好了,剩下的事情都是需要由这个子线程来完成的。所以主线程肯定不会给你去处理任务队列里边的节点。在主线程里边,其实它是有一个反应堆模型的,在当前的这个子线程里边也有一个反应堆模型。每个反应堆模型里边都有一个Dispatcher。关于这个Dispatcher就是epoll、poll、或者select模型,所以主线程去处理的话,这个任务就放到主线程的那个Dispatcher里边了,这样很显然是不对的。故在子线程的任务队列里边有了任务之后,还需要交给子线程的Dispatcher去处理。因此这个节点的处理,还需要判断当前线程到底是什么线程。
  • 如果它是主线程不能让它去处理,如果是子线程,直接让它去处理。 
// 添加任务到任务队列
int eventLoopAddTask(struct EventLoop* evLoop,struct Channel* channel,int type) {// 加锁,保护共享资源pthread_mutex_lock(&evLoop->mutex);// 创建新节点,后添加到任务队列中去struct ChannelElement* node = (struct ChannelElement*)malloc(sizeof(struct ChannelElement));node->channel = channel;node->type = type;node->next = NULL;// 链表为空if(evLoop->head == NULL) {evLoop->head = evLoop->tail = node;}else {evLoop->tail->next = node; // 添加evLoop->tail = node; // 后移}pthread_mutex_unlock(&evLoop->mutex);// 处理节点/*** 这个描述假设了一个前提条件,就是当前的EventLoop反应堆属于子线程* 细节:*  1.对于链表节点的添加:可能是当前线程也可能是其他线程(主线程)*      1).修改fd的事件,当前子线程发起,当前子线程处理*      2).添加新的fd(意味着和一个新的客户端建立连接,这是由主线程做的,故添加任务节点这个操作肯定是由主线程做的),*          添加任务节点的操作是由主线程发起的*  2.不能让主线程处理任务队列里边的节点,需要由当前的子线程去处理*/if(evLoop->threadID == pthread_self()) {// 当前子线程(待续写)...}else{// 主线程 -- 告诉子线程处理任务队列中的任务// 1.子线程在工作 2.子线程被阻塞了:select、poll、epoll(待续写)...}return 0;
}

一、任务队列与文件描述符

  • dispatcher中,存在一个带检测的文件描述符集合。任务队列用于修改这个集合,例如添加、删除或修改。任务队列实际上是一个链表,每个节点代表一个channel元素。每个节点包含三个成员:channel类型、文件描述符和操作类型

二、任务队列的线程同步

  • 由于任务队列可能被多个线程访问,因此在操作任务队列时需要进行线程同步
  • 这意味着在添加新节点到任务队列时,需要确保线程安全

三、节点的添加与操作

  • 节点添加:当链表为空时,直接将新节点设置为任务队列的头;当链表不为空时,将新节点添加到链表的尾部(即tail节点的后边),并更新tail节点的next指针。
  • 节点操作:将节点的处理操作移至另一个函数中,以便于程序的维护

四、线程角色与任务处理

  • 主线程子线程的角色:添加任务节点可能是当前线程或主线程的操作。
  • 主线程负责与新客户端建立连接,而子线程处理其他任务
  • 主线程与子线程的任务分配:主线程不会处理任务队列中的节点,而是通知子线程去处理

五、总结

  • dispatcher中的处理流程,包括任务队列用于修改一个带检测的文件描述符集合、线程同步以及节点的添加和操作。为了确保程序的稳定性和正确性,我们需要关注线程安全和任务分配,确保每个线程都能在其角色范围内高效地工作。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/316118.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【心得】PHP文件包含高级利用攻击面个人笔记

目录 一、nginx日志文件包含 二、临时文件包含 三、php的session文件包含 四、pear文件包含 五 、远程文件包含 文件包含 include "/var/www/html/flag.php"; 一 文件名可控 $file$_GET[file]; include $file.".php"; //用php伪协议 &#xff0…

基于矩阵乘的CUDA编程优化过程

背景:网上很多关于矩阵乘的编程优化思路,本着看理论分析万遍,不如实际代码写一遍的想法,大概过一下优化思路。 矩阵乘的定义如下,约定矩阵的形状及存储方式为: A[M, K], B[K, N], C[M, N]。 CPU篇 朴素实现方法 按照…

test dbtest-03-对比 Liquibase、flyway、dbDeploy、dbsetup

详细对比 Liquibase、flyway、dbDeploy、dbsetup,给出对比表格 下面是一个简要的对比表格,涵盖了 Liquibase、Flyway、dbDeploy 和 DbSetup 这四个数据库变更管理工具的一些主要特点。 特点/工具LiquibaseFlywaydbDeployDbSetup开发语言Java&#xff0…

c++初阶-------类和对象

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

【Spark精讲】记一个SparkSQL引擎层面的优化:SortMergeJoinExec

SparkSQL的Join执行流程 如下图所示,在分析不同类型的Join具体执行之前,先介绍Join执行的基本框架,框架中的一些概念和定义是在不同的SQL场景中使用的。 在Spark SQL中Join的实现都基于一个基本的流程,根据角色的不同&#xff0…

C# visual studio COM创建及调用

1.visual studuio操作 1.1visual Studio创建类库项目ClassLibrary1。 1.1.1ClassLibrary1项目Class1.cs内容如下: using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.T…

Spring技术内幕笔记之SpringMvc

WebApplicationContext接口的类继承关系 org.springframework.web.context.ContextLoader#initWebApplicationContext 对IOC容器的初始化 SpringMvc如何设计 DispatcherServlet类继承关系 MVC处理流程图如下: DispatcherServlet的工作大致可以分为两个部分&#xf…

使用GPTs+Actions自动获取第三方数据

目录 安装插件与GPT对话联网插件首先,创建GPTs。 Voxscript 官网:https://voxscript.awt.icu/index.htmlOpenAI Schema:https://voxscript.awt.icu/swagger/v1/swagger.yamlServer URL: servers: url: https://voxscript.awt.icu安装插件 要使用这个插件&

RK3568 学习笔记 : 解决 linux_sdk 编译 python 版本报错问题

前言 最近买了 【正点原子】 的 RK3568 开发板,下载了 开发板的资料,包括 Linux SDK,这个 Linux SDK 占用的空间比较大,扩展了一下 VM 虚拟机 ubuntu 20.04 的硬盘空间,编译才正常通过。 编译 RK3568 Linux SDK 时&am…

文件监控软件丨文件权限管理工具

文件已经成为企业最重要的资产之一。然而,文件的安全性和完整性经常受到威胁,如恶意软件感染、人为误操作、内部泄密等。 为了确保文件的安全,文件监控软件应运而生。本文将深入探讨文件监控软件的概念、功能、应用场景和未来发展等方面。 文…

解决jenkins的Exec command命令不生效,或者执行停不下来的问题

Jenkins构建完后将war包通过 Publish Over SSH 的插件发布到服务器上,在服务器上执行脚本时,脚本中的 nohup 命令无法执行,并不生效,我配置的Exec command命令是后台启动一个war包,并输出日志文件。 nohup java -jar /…

webpack 5 loader

webpack 本身不能识别js&#xff0c;json外的资源&#xff0c;所以我们需要借助其他loader来处理对应的文件 CSS Loader&#xff0c;处理css 安装 npm i css-loader style-loader -D css-loader 负责讲css编译成webpack能识别的模块内容style-loader 动态创建<style&g…