STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知)

STM32 CubeMX


STM32 CubeMX ____Freertos任务通信:队列、信号量、互斥量,事件组,任务通知

  • STM32 CubeMX
  • 一、STM32 CubeMX设置
    • 时钟配置
    • HAL时基选择TIM1(不要选择滴答定时器;滴答定时器留给OS系统做时基)
    • 使用STM32 CubeMX 库,配置Freertos
  • 二、实验一:消息队列
    • 消息队列是什么?适用于什么地方?
    • FreeRTOS 消息队列和数组 的几个区别:
    • 创建消息队列
    • 创建任务
    • 代码部分
    • 实验现象
  • 三,实验二:信号量
    • 信号量是什么?适用于什么地方?
    • 二值信号量
    • `代码部分`
    • 实验现象
    • 计数信号量
    • `代码部分`
    • 实验现象
  • 四,实验三:互斥量
    • 互斥量是什么?适用于什么地方?
    • `代码部分`
    • 实验现象
  • 五,实验四:事件组
    • 互斥量是什么?适用于什么地方?
    • 与逻辑,事件组
    • 实验现象
    • 或逻辑,事件组
    • 实验现象
  • 六,实验五:任务通知


学习使用Freertos第二步
在 FreeRTOS 中,任务通信可以通过以下函数来实现:

  1. xQueueCreate():用于创建一个消息队列。可以设置队列长度和每个消息的大小。

xQueueSend():将一条消息发送到队列中。可以选择阻塞或非阻塞发送。

xQueueReceive():从队列中接收一条消息。可以选择阻塞或非阻塞接收。

xQueuePeek():查看队列中的下一条消息,但不将其移除。

xQueueReset():清空队列中的所有消息。
2. xQueueSemaphoreTake()xQueueSemaphoreGive():用于实现二值信号量,控制任务之间的互斥访问。
3. xSemaphoreCreateMutex():创建一个互斥信号量,用于实现任务之间的互斥访问。
4. xTaskNotify()ulTaskNotifyTake():用于任务间的通知机制,一个任务可以通知另一个任务进行某种操作。
5. xEventGroupCreate()、xEventGroupSetBits()和xEventGroupWaitBits():用于创建、设置和等待事件标志组。

一、STM32 CubeMX设置

时钟配置

在这里插入图片描述

HAL时基选择TIM1(不要选择滴答定时器;滴答定时器留给OS系统做时基)

在这里插入图片描述

使用STM32 CubeMX 库,配置Freertos

选择CMISS_V1接口就可以满足Freertos接口;且代码量比CMISS_V2小(CMISS_V2支持更多的RTOS接口,所以代码量比CMISS_V1多)
在这里插入图片描述

二、实验一:消息队列

消息队列是什么?适用于什么地方?

  • 数据传递:消息队列允许任务之间传递数据,一个任务可以将数据打包成消息发送到队列,另一个任务则可以从队列中接收该消息并处理其中的数据。这使得任务之间可以方便地进行数据交换和共享。
  • 任务解耦:通过使用消息队列,任务之间的耦合度可以降低。一个任务只需要关注发送和接收消息,而不需要知道消息的具体处理细节和目标任务的实现。这样,当需要更改或替换某个任务时,只需要保证消息的格式和接口不变即可,不会对其他任务产生影响。
  • 同步与协作:消息队列可以用于实现任务之间的同步和协作。例如,一个任务可以等待某个特定的消息到达队列后才继续执行,从而实现任务间的同步。另外,多个任务可以通过发送和接收消息来协调彼此的执行顺序和操作。
  • 缓冲和调节:消息队列可以充当缓冲区,用于存储一定数量的消息。当发送方发送消息速度较快,而接收方处理速度较慢时,消息队列可以暂时存储未处理的消息,避免数据丢失。同时,消息队列还可以调节发送和接收任务之间的速度差异,以平衡任务负载。

FreeRTOS 消息队列和数组 的几个区别:

  • 数据组织方式:消息队列是一种先进先出(FIFO)的数据结构,用于存储和传递消息。每个消息都可以包含不同类型和长度的数据。而数组是一种线性的、连续的数据结构,用于存储相同类型和长度的元素。
  • 功能和用途:消息队列主要用于任务间通信,允许任务之间传递数据和进行同步。它提供了数据传递、解耦、同步和协作等功能。而数组通常用于存储一组具有相同类型的元素,可以进行遍历、访问和修改等操作。
  • 大小和容量:消息队列的大小是可以动态调整的,可以根据需要增加或减少队列的容量。而数组的大小在创建时就确定,并且通常是固定的。
  • 可用性和效率:消息队列可以实现多个任务之间的并发通信,提供了较高的可用性和灵活性。而数组通常在单个任务内进行操作,具有较高的效率和直接性
  • 总的来说,消息队列和数组是两种不同的数据结构,适用于不同的场景和需求。消息队列主要用于任务间通信和数据传递,具有灵活性和可调节性;而数组主要用于存储相同类型的元素,并进行遍历和访问操作。选择使用哪种数据结构取决于具体的应用需求和功能要求。

创建消息队列

在这里插入图片描述

  • Queue Name: 队列名称
  • Queue Size: 队列能够存储的最大单元数目,即队列深度
  • Queue Size: 队列中数据单元的长度,以字节为单位
  • Allocation: 分配方式:Dynamic 动态内存创建
  • Buffer Name: 缓冲区名称
  • Buffer Size: 缓冲区大小
  • Conrol Block Name: 控制块名称

创建任务

在这里插入图片描述

  • Task Name: 任务名称
  • Priority: 优先级,在 FreeRTOS 中,数值越大优先级越高,0 代表最低优先级
  • Stack Size (Words): 堆栈大小,单位为字,在32位处理器(STM32),一个字等于4字节,如果传入128那么任务大小为128*4字节
  • Entry Function: 入口函数
  • Code Generation Option: 代码生成选项
  • Parameter: 任务入口函数形参,不用的时候配置为0或NULL即可
  • Allocation: 分配方式:Dynamic 动态内存创建
  • Buffer Name: 缓冲区名称
  • Conrol Block Name: 控制块名称

代码部分

void sendTask1(void const * argument)
{/* USER CODE BEGIN sendTask1 */BaseType_t xsatus;uint32_t buff=9600;/* Infinite loop */for(;;){xsatus=xQueueSendToBack(myQueue01Handle,&buff,0);if( xsatus!=pdPASS){printf("输入失败\r\n");		// printf输出字符串}else{printf("成功写入%d\r\n", buff);		// printf输出字符串}osDelay(1000);}/* USER CODE END sendTask1 */
}
void readTask3(void const * argument)
{/* USER CODE BEGIN readTask3 */BaseType_t xsatus;uint32_t buff=115200;/* Infinite loop */for(;;){xsatus=xQueueReceive(myQueue01Handle,&buff,0);if( xsatus!=pdPASS){printf("读取失败\r\n");		// printf输出字符串}else{printf("成功读取%d\r\n", buff);		// printf输出字符串}osDelay(3000);}/* USER CODE END readTask3 */
}

实验现象

在这里插入图片描述

 xsatus=xQueueSendToBack(myQueue01Handle,&buff,portMAX_DELAY);//一直等待if( xsatus!=pdPASS){printf("输入失败\r\n");		// printf输出字符串}else{printf("成功写入%d\r\n", buff);		// printf输出字符串}

还一种方式:读取不会删除信息(偷窥信息)

三,实验二:信号量

信号量是什么?适用于什么地方?

FreeRTOS中的信号量是一种用于任务间同步和资源共享的机制。它可以用来实现任务之间的互斥访问共享资源,或者在某个任务等待某个事件发生时进行阻塞。

FreeRTOS提供了两种类型的信号量:二进制信号量(Binary Semaphore)和计数信号量(Counting Semaphore)。

二进制信号量是一种简单的信号量,只有两种状态:空闲和占用。当一个任务获取到二进制信号量时,它就可以继续执行,而其他任务则会被阻塞。当任务释放二进制信号量时,其他任务可以获取到它并继续执行。

计数信号量是一种更复杂的信号量,它可以有多个资源可供获取。计数信号量可以用来实现资源池的管理,例如限制同时访问某个资源的任务数量

在FreeRTOS中,可以使用以下函数来创建和操作信号量:

  • xSemaphoreCreateBinary(): 创建二进制信号量。
  • xSemaphoreCreateCounting(): 创建计数信号量。
  • xSemaphoreTake(): 获取一个信号量。
  • xSemaphoreGive(): 释放一个信号量。

需要注意的是,使用信号量时要确保正确的获取和释放顺序,以避免出现死锁或资源竞争的问题。

二值信号量

创建信号量
在这里插入图片描述

代码部分

void sendTask1(void const * argument)
{/* USER CODE BEGIN sendTask1 */BaseType_t xsatus;uint32_t buff=9600;/* Infinite loop */for(;;){if( xSemaphoreTake(myBinarySem01Handle,portMAX_DELAY)!=pdPASS){printf("刷新失败#信号量获取失败\r\n");		// printf输出字符串}else{printf("成功刷新#信号量获取成功\r\n");		// printf输出字符串}osDelay(2000);}/* USER CODE END sendTask1 */
}
void readTask3(void const * argument)
{/* USER CODE BEGIN readTask3 */BaseType_t xsatus;uint32_t buff=115200;/* Infinite loop */for(;;){if( xSemaphoreGive(myBinarySem01Handle)!=pdPASS){printf("读取失败#信号量不能释放\r\n");		// printf输出字符串}else{printf("成功读取#信号量已经释放\r\n");		// printf输出字符串}osDelay(1000);}/* USER CODE END readTask3 */
}

实验现象

在这里插入图片描述

计数信号量

创建计数信号量
在这里插入图片描述
在这里插入图片描述

代码部分

void sendTask1(void const * argument)
{/* USER CODE BEGIN sendTask1 */BaseType_t xsatus;uint32_t buff=9600;/* Infinite loop */for(;;){if( xSemaphoreGive(myCountingSem01Handle)!=pdTRUE){printf("停车已满\r\n");		// printf输出字符串}else{printf("停车成功\r\n");		// printf输出字符串}osDelay(2000);}/* USER CODE END sendTask1 */
}
void readTask3(void const * argument)
{/* USER CODE BEGIN readTask3 */BaseType_t xsatus;uint32_t buff=115200;/* Infinite loop */for(;;){if( xSemaphoreTake(myCountingSem01Handle,0)!=pdTRUE){printf("无车\r\n");		// printf输出字符串}else{printf("取走车\r\n");		// printf输出字符串}osDelay(1000);}/* USER CODE END readTask3 */
}

实验现象

在这里插入图片描述

四,实验三:互斥量

互斥量是什么?适用于什么地方?

FreeRTOS中的互斥量(Mutex)是一种用于保护共享资源的同步机制。它可以确保在任何给定时刻只有一个任务可以访问被保护资源,以避免竞争条件和数据损坏。

在FreeRTOS中,互斥量通过以下API函数进行创建、获取和释放:

  • xSemaphoreCreateMutex():用于创建一个互斥量,并返回一个指向该互斥量的句柄。
  • xSemaphoreTake():用于获取(锁定)互斥量。如果互斥量当前未被锁定,则任务可以 获取互斥量并继续执行;否则,任务将被阻塞,直到互斥量可用。
  • xSemaphoreGive():用于释放(解锁)互斥量。一旦任务完成了对共享资源的访问,应该调用此函数来释放互斥量,以允许其他任务获取它。
    创建互斥量
    在这里插入图片描述

代码部分

void sendTask1(void const * argument)
{/* USER CODE BEGIN sendTask1 */BaseType_t xsatus;uint32_t buff=9600;/* Infinite loop */for(;;){osDelay(20);if(xSemaphoreTake(myMutex01Handle,portMAX_DELAY)!=pdTRUE){printf("1号:你上完厕所,下一个就轮到我了\r\n");		// printf输出字符串}else{printf("1号:现在是我在上厕所\r\n");		// printf输出字符串xSemaphoreGive(myMutex01Handle);printf("1号:我上完了\r\n");		// printf输出字符串}	osDelay(2000);}/* USER CODE END sendTask1 */
}/* USER CODE BEGIN Header_sendTask2 */
/**
* @brief Function implementing the Task2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_sendTask2 */
void sendTask2(void const * argument)
{/* USER CODE BEGIN sendTask2 */BaseType_t xsatus;uint32_t buff=115200;/* Infinite loop */for(;;){xSemaphoreTake(myMutex01Handle,0); printf("2号:我在厕所\r\n");		// printf输出字符串osDelay(3000);printf("2号:我上完了\r\n");		// printf输出字符串xSemaphoreGive(myMutex01Handle);osDelay(2000);}/* USER CODE END sendTask2 */
}/* USER CODE BEGIN Header_readTask3 */
/**
* @brief Function implementing the read thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_readTask3 */
void readTask3(void const * argument)
{/* USER CODE BEGIN readTask3 */BaseType_t xsatus;uint32_t buff=115200;/* Infinite loop */for(;;){if(xSemaphoreTake(myMutex01Handle,0)!=pdTRUE){printf("3号:厕所有人,等一会儿再来\r\n");		// printf输出字符串}else{printf("3号:到我上小便了\r\n");		// printf输出字符串printf("3号:我撒完尿了\r\n");		// printf输出字符串xSemaphoreGive(myMutex01Handle);}	 osDelay(1000);}/* USER CODE END readTask3 */
}

实验现象

在这里插入图片描述

五,实验四:事件组

互斥量是什么?适用于什么地方?

FreeRTOS事件组是一个用于多任务协调和通信的机制。它允许任务等待多个事件同时发生,并在事件发生后恢复任务的执行。事件组可以用于线程同步、互斥、事件通知等应用场景。

FreeRTOS事件组由32位的二进制位表示,每个事件标志位对应一个事件。任务可以通过等待特定的事件标志位来挂起自己的执行,并在其中一个或多个事件标志位被设置时被唤醒。任务还可以使用事件组的API函数来设置或清除特定的事件标志位。

以下是一些常用的FreeRTOS事件组API函数:

  1. xEventGroupCreate():创建一个新的事件组。
  2. vEventGroupDelete():删除已创建的事件组。
  3. xEventGroupSetBits():设置一个或多个事件标志位。
  4. xEventGroupClearBits():清除一个或多个事件标志位。
  5. xEventGroupWaitBits():等待一个或多个事件标志位被设置。

使用FreeRTOS事件组可以实现任务之间的同步和通信,提高系统的可靠性和效率。
**CMSIS_V1不支持创建事件组,所以手创建 **

EventGroupHandle_t myEvent=NULL;//创建句柄
myEvent = 	xEventGroupCreate(); //创建事件组

与逻辑,事件组

任务代码:

/* USER CODE END Header_sendTask1 */
void sendTask1(void const * argument)
{/* USER CODE BEGIN sendTask1 */BaseType_t xsatus;uint32_t buff=9600;/* Infinite loop */for(;;){printf("1号:这个方案我同意了\r\n");		// printf输出字符串xEventGroupSetBits(myEvent,0x0001);			   osDelay(2000);}/* USER CODE END sendTask1 */
}/* USER CODE BEGIN Header_sendTask2 */
/**
* @brief Function implementing the Task2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_sendTask2 */
void sendTask2(void const * argument)
{/* USER CODE BEGIN sendTask2 */BaseType_t xsatus;uint32_t buff=115200;/* Infinite loop */for(;;){osDelay(5000);printf("2号:这个方案我同意了\r\n");		// printf输出字符串xEventGroupSetBits(myEvent,0x0010);			   			}/* USER CODE END sendTask2 */
}/* USER CODE BEGIN Header_readTask3 */
/**
* @brief Function implementing the read thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_readTask3 */
void readTask3(void const * argument)
{/* USER CODE BEGIN readTask3 */BaseType_t xsatus;uint32_t buff=115200;/* Infinite loop */for(;;){buff=xEventGroupWaitBits(myEvent,0x0011,pdTRUE,pdTRUE,portMAX_DELAY);//1.句柄;2.哪些位;3.读完清零;4.全部有效(与逻辑);5.等待时间if(buff==0x0011){printf("3号:好这个方案全票同意\r\n");		// printf输出字符串}osDelay(10000);}/* USER CODE END readTask3 */
}

实验现象

在这里插入图片描述

或逻辑,事件组

void sendTask1(void const * argument)
{/* USER CODE BEGIN sendTask1 */BaseType_t xsatus;uint32_t buff=9600;/* Infinite loop */for(;;){printf("1号:这个方案我同意了\r\n");		// printf输出字符串xEventGroupSetBits(myEvent,0x0001);			   osDelay(2000);}/* USER CODE END sendTask1 */
}/* USER CODE BEGIN Header_sendTask2 */
/**
* @brief Function implementing the Task2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_sendTask2 */
void sendTask2(void const * argument)
{/* USER CODE BEGIN sendTask2 */BaseType_t xsatus;uint32_t buff=115200;/* Infinite loop */for(;;){osDelay(5000);printf("2号:这个方案我同意了\r\n");		// printf输出字符串xEventGroupSetBits(myEvent,0x0010);			   			}/* USER CODE END sendTask2 */
}/* USER CODE BEGIN Header_readTask3 */
/**
* @brief Function implementing the read thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_readTask3 */
void readTask3(void const * argument)
{/* USER CODE BEGIN readTask3 */BaseType_t xsatus;uint32_t buff=115200;/* Infinite loop */for(;;){buff=xEventGroupWaitBits(myEvent,0x0011,pdTRUE,pdFALSE,portMAX_DELAY);//1.句柄;2.哪些位;3.读完清零;4.全部有效(与逻辑);5.等待时间if((buff==0x0010)||(buff==0x0001)){printf("3号:好方案通过,下一个方案\r\n");		// printf输出字符串}}/* USER CODE END readTask3 */
}

实验现象

在这里插入图片描述

六,实验五:任务通知

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

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

相关文章

苍穹外卖 day3 实现登录过程中MD5加密

一 原来是明文存的 密码可见度太高,MD5加密为密文图像 效果 二 密文实现步骤 修改明文密码,改成密文 123456 密文值:e10adc3949ba59abbe56e057f20f883e代码如下所示 在这里插入代码片 package com.sky.service.impl;import com.sky.con…

Vue使用Animate.css

说一下Animate.css这个动画库,很多的动画在这个库里面都定义好了,我们用的时候可以直接使用里面的类名就可以了,就是直接目标元素绑定对应的类名就可以实现动画效果,非常方便,库其实也相对简单,使用起来也简…

数据结构(3)

线性表是多个具有相同特征的数据的有限序列。 前驱元素:A在B前面,称A为B的前驱元素。 后继元素:B在A后面,称B为A的后继元素。 线性表特征: 1.一个元素没有前驱元素,就是头结点; 2.最后一个…

法线矩阵推导

法线矩阵推导 https://zhuanlan.zhihu.com/p/72734738 https://juejin.cn/post/7113952418613690382 https://blog.csdn.net/wangjianxin97?typeblog 1、为什么需要法线矩阵 vec3 normalEyeSpace modelViewMatrix * normal;如果模型矩阵执行了非等比缩放, 顶点的改变会导致法…

PSP - 蛋白质结构预测 AlphaFold2 的结构模版 (Template) 搜索与特征逻辑

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132427617 结构模版 (Template) 是一种已知的蛋白质结构,可以作为 AlphaFold2 蛋白质结构预测的参考,AlphaFold2 可以从多…

springMVC 已解密的登录请求

问题描述: 解决方案: 1.对用户所输入的密码在页面进行MD5加密并反馈至密码输入框。 2. 手动生成SSL安全访问证书;在此不做介绍,相关方法可通过网上查找; 3. 将产品HTTP访问方式改为SSL安全访问方式;在Ap…

【C++】STL——map的介绍和使用、map的构造函数、map的迭代器、map的容量和访问函数、map的增删查改函数

文章目录 1.map的介绍2.map的使用2.1map的构造函数2.2map的迭代器2.3map的容量和访问函数2.4map的增删查改函数 1.map的介绍 map的介绍 (1)map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。 &#xff…

【React学习】React组件生命周期

1. 介绍 在 React 中,组件的生命周期是指组件从被创建到被销毁的整个过程。React框架提供了一系列生命周期方法,在不同的生命周期方法中,开发人员可以执行不同的操作,例如初始化状态、数据加载、渲染、更新等。一个组件的生命周期…

C# 使用递归方法实现汉诺塔步数计算

C# 使用递归方法实现汉诺塔步数计算 Part 1 什么是递归Part 2 汉诺塔Part 3 程序 Part 1 什么是递归 举一个例子:计算从 1 到 x 的总和 public int SumFrom1ToX(int x) {if(x 1){return 1;}else{int result x SumFrom1ToX_2(x - 1); // 调用自己return result…

Vim学习(四)——命令使用技巧

命令模式 打开文本默认模式,按**【ESC】**重新进入 【/关键字】:搜索匹配关键字 G:最后一行 gg:第一行 hjkl:左下右上 yy: 复制一行 dd:删除一行 p:粘贴 u: 撤销插入模式 按**【i / a / o】**键均可进入文本编辑模式…

2023年国赛 高教社杯数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…

uniapp 回退到指定页面 保存页面状态

uniapp 历史页面回退到指定页面。 getCurrentPages() 内容如下 let delta getCurrentPages().reverse().findIndex(item > item.route "pages/popularScience/daodi") if(delta-1){uni.navigateTo({url: /pages/popularScience/daodi,success: res > {},fa…

Python编程基础-文件的打开和读取

文件的访问 使用 open() 函数 打开文件 ,返回一个 file 对象 使用 file 对象的读 / 写方法对文件进行读 / 写的 操作 使用 file 对象的 close() 方法关闭文件 打开文件 open()方法,需要一个字符串路径,并返回一个文件对象,默认是”…

2023年国赛数学建模思路 - 案例:退火算法

文章目录 1 退火算法原理1.1 物理背景1.2 背后的数学模型 2 退火算法实现2.1 算法流程2.2算法实现 建模资料 ## 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上&a…

【分享】华为设备登录安全配置案例

微思网络www.xmws.cn,2002年成立,专业IT认证培训21年,面向全国招生! 微 信 号 咨 询: xmws-IT 华为HCIA试听课程:超级实用,华为VRP系统文件详解【视频教学】华为VRP系统文件详解 华为HCIA试听课…

原生轮播图的实现

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>轮播图</title><style>* {margin: 0;pad…

WGS84地球坐标系,GCJ02火星坐标系,BD09百度坐标系简介与转换 资料收集

野火 ATGM332D简介 高性能、低功耗 GPS、北斗双模定位模块 STM32 GPS定位_为了维护世界和平_的博客-CSDN博客 秉火多功能调试助手上位机开源&#xff01;共六款软件&#xff0c;学到你吐... , - 电脑上位机 - 野火电子论坛 - Powered by Discuz! https://www.firebbs.cn/for…

jenkins 是什么?

一、jenkins 是什么&#xff1f; Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;起源于Hudson&#xff0c;主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。Jenkins用Java语言编写&#xff0c;可在Tomcat等流行的servlet容器中运行&#…

Tomcat线程池梳理

Tomcat梳理 文章目录 Tomcat梳理1.问题2.监控tomcat线程池springboot1.xspringboot2.x转为json格式打印输出 3.SpringBoot内置线程解析测试controlleryaml配置可知ThreadPoolExecutor有如下五种线程池状态。线程池监控指标并发测试并发请求数 < Tomcat最大线程数20并发请求数…

mysql并行效率提升

下面是一个并行读取mysql数据库表的测试程序&#xff0c;测试结果发现&#xff0c;读取10个表&#xff0c;1个个读取&#xff0c;和并行读取10个&#xff0c;效率一样&#xff0c;甚至并行读取还慢很多&#xff0c;这是为什么&#xff1f; con get_db_conn() results {} poo…