基于多反应堆的高并发服务器【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.mzph.cn/news/601187.shtml

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

相关文章

迅为RK3588开发板使用 FFMpeg 进行推流

Debian/Ubuntu 系统使用以下命令安装 FFMpeg ,如下图所示: apt-get install ffmpeg 使用 ifconfig 查看开发板 ip 为 192.168.1.245 如下图所示: 使用 FFMpeg 推流一个 mp4 视频进行测试,作者将测试视频 test.mp4 放在了根目录下…

轻松入门:Anaconda 在 PyCharm 中的配置与应用指南

1 Anaconda Anaconda 和 Conda 是两个相关但不同的概念。 Anaconda 是一个免费且开源的发行版,包含了 Python 和 R 语言的数据科学和机器学习相关的众多包,它包括 Conda、Python、Jupyter Notebook 等多个科学计算和数据科学中常用的应用。 Anaconda 通过…

外包干了4个月,技术退步明显了...

先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四…

K8S陈述式资源管理(1)

命令行: kubectl命令行工具 优点: 90%以上的场景都可以满足对资源的增,删,查比较方便,对改不是很友好 缺点:命令比较冗长,复杂,难记声明式 声明式:K8S当中的yaml文件来实现资源管理 GUI:图形…

第九节HarmonyOS 常用基础组件7-RichText

1、描述 富文本组件,解析并显示HTML格式文本。 富文本(RichText)是一种特殊的文本格式,它比普通文本更加丰富多彩。富文本可以包含各种字体、颜色、大小、图像、链接、表格、视频等元素,使文本更加生动、有趣。 2、…

【elastic search】下载安装、使用教程

目录 1.下载安装 1.1.ES&Kibana 1.2.分词器 2.操作 2.1.索引操作 2.1.1.索引的新增、删除、查找 2.1.2.数据类型 2.1.3.结构化 2.2.文档操作 2.2.1.文档的增、删、改 2.2.2.文档的查询 2.2.3.聚合操作 1.下载安装 1.1.ES&Kibana Kibana是一个开源的数据可…

OpenHarmony如何隐藏系统状态栏、导航栏

前言 OpenHarmony源码版本:4.0release 开发板:DAYU / rk3568 一、通过setWindowSystemBarEnable方法设置 当我们应用的Alility继承的是UIAbility时,可以onWindowStageCreate(windowStage: window.WindowStage)方法中实现如下操作&#xf…

【AI】搭建Windows Linux子系统(WSL2)CUDA环境

0.准备工作 Windows本机安装CUDA Driver 首先去下载页面下载驱动文件 点击Get CUDA Driver进入下载页面,我看下载页面跟普通驱动下载页面相同,感觉应该不是单独的驱动,只要之前显卡已经安装好了CUDA的驱动,就可以先省略这一步。…

spi_2024.1.2

spi.h #ifndef __SPI_H__ #define __SPI_H__#include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h"#include"uart4.h" #include"key_it.h" // MOSI对应的引脚输出高低电平的信号PE14 #define MOSI_OUTPUT_H() do{GPIOE->O…

手写视频裁剪框

<!-- 截取框 --><divv-show"isShow"class"crop-box":style"{width: cropWidth px,height: cropHeight px,left: cropX px,top: cropY px,}"ref"cropBox"mousedown"startInteraction"><!-- 内容在这里 --…

【AI视野·今日CV 计算机视觉论文速览 第280期】Mon, 1 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Mon, 1 Jan 2024 Totally 46 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Learning Vision from Models Rivals Learning Vision from Data Authors Yonglong Tian, Lijie Fan, Kaifeng Chen, Dina K…

二、类与对象(四)

22 内部类 22.1 内部类的概念 如果一个类定义在另一个类的内部&#xff0c;这个类就叫做内部类。内部类是一个独立的类&#xff0c;它不属于外部类&#xff0c;更不能通过外部类的对象去访问内部类的成员&#xff0c;外部类对内部类没有任何优越的访问权限&#xff0c;也就是…

LINUX基础培训之开机启动过程

前言、本章学习目标 掌握系统启动、引导过程 了解grub.conf的参数设置 熟悉系统运行级别 了解加载内核过程 一、LINUX启动引导过程 Linux系统的启动过程并不是大家想象中的那么复杂&#xff0c;其过程可以分为5个阶段&#xff1a; 1.开机自检 服务器主机开机以后&#xf…

Spring Beans的魔法门:解密多种配置方式【beans 四】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Spring Beans的魔法门&#xff1a;解密多种配置方式【beans 四】 前言XML配置方式1. 声明和配置Bean&#xff1a;2. 构造函数注入&#xff1a;3. 导入其他配置文件&#xff1a; java注解方式1. 使用Co…

算法训练营Day35

#Java #动态规划 开源学习资料 Feeling and experiences&#xff1a; 不同路径&#xff1a;力扣题目链接 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右…

MyBatisPlus学习三:Service接口、代码生成器

学习教程 黑马程序员最新MybatisPlus全套视频教程&#xff0c;4小时快速精通mybatis-plus框架 Service接口 简介 在MyBatis-Plus框架中&#xff0c;Service接口的作用是为实体类提供一系列的通用CRUD&#xff08;增删改查&#xff09;操作方法。通常情况下&#xff0c;Servi…

PyTorch 入门学习数据操作之创建

简介 在深度学习中&#xff0c;我们通常会频繁地对数据进行操作&#xff1b;要操作一般就需要先创建。 官方介绍 The torch package contains data structures for multi-dimensional tensors and defines mathematical operations over these tensors. Additionally, it pr…

SpringMVC通用后台管理系统源码

整体的SSM后台管理框架功能已经初具雏形&#xff0c;前端界面风格采用了结构简单、 性能优良、页面美观大的Layui页面展示框架 数据库支持了SQLserver,只需修改配置文件即可实现数据库之间的转换。 系统工具中加入了定时任务管理和cron生成器&#xff0c;轻松实现系统调度问…

【源码解析】Apache RocketMQ发送消息源码

send message源码解析 引入 send message方法作为我们经常使用的方法&#xff0c;平时我们很难去关注他底层到底做了什么。大部分人只知道通过send message方法可以将消息发送到broker&#xff0c;然后供消费者进行消费。其实不然&#xff0c;消息从客户端发送到broker&#x…

ssm基于vue.js的购物商场的设计与实现论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装购物商场软件来发挥其高效地信息处理的作用&#xff0c;可以…