Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
2024-RSOC
【2024-RSOC】多线程的学习分享
发布于 2024-07-23 19:26:10 浏览:556
订阅该版
[tocm] ![问题描述](https://oss-club.rt-thread.org/uploads/20240723/c816c8481b33eb31dde06cdb13373e02.png.webp) # RT-Thread 同步示例 这个示例演示了一个经典的同步问题,使用RT-Thread实时操作系统。场景包括四个线程:`dad`(爸爸),`mom`(妈妈),`daughter`(女儿),和`son`(儿子),代表一个家庭,爸爸和妈妈分别生产苹果和橘子,而女儿和儿子则消费它们。 ## 宏和全局变量 ### 宏定义 - `THREAD_PRIORITY`: 线程的优先级。 - `THREAD_STACK_SIZE`: 分配给每个线程的栈大小。 - `THREAD_TIMESLICE`: 分配给线程执行的时间片。 ### 全局变量 - `rt_thread_t dad, mom, daughter, son`: 家庭成员的线程控制块。 - `rt_mutex_t dynamic_mutex`: 保护临界区的互斥量。 - `rt_semaphore apple, orange, plate`: 用于同步的信号量。 ## 线程函数 ### 爸爸线程 ```c void dad_(void *parameter) { while (1) { rt_sem_take(&plate, RT_WAITING_FOREVER); rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER); num_apple++; rt_kprintf("加入苹果 %d\n", num_apple); rt_mutex_release(dynamic_mutex); rt_sem_release(&apple); rt_thread_mdelay(100); // 模拟生产时间 } } ``` 这个函数模拟爸爸生产苹果的过程。每次生产一个苹果后,会打印当前苹果数量,并释放apple信号量以通知消费者线程。 ### 妈妈线程 ```c void mom_(void *parameter) { while (1) { rt_sem_take(&plate, RT_WAITING_FOREVER); rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER); num_orange++; rt_kprintf("加入橘子 %d\n", num_orange); rt_mutex_release(dynamic_mutex); rt_sem_release(&orange); rt_thread_mdelay(100); // 模拟生产时间 } } ``` 这个函数模拟妈妈生产橘子的过程。每次生产一个橘子后,会打印当前橘子数量,并释放orange信号量以通知消费者线程。 ### 儿子线程 ```c void son_(void *parameter) { while (1) { rt_sem_take(&orange, RT_WAITING_FOREVER); rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER); num_orange--; rt_kprintf("吃掉橘子 %d\n", num_orange); rt_mutex_release(dynamic_mutex); rt_sem_release(&plate); rt_thread_mdelay(100); // 模拟消费时间 } } ``` 这个函数模拟儿子消费橘子的过程。每次消费一个橘子后,会打印当前橘子数量,并释放plate信号量以通知生产者线程。 ### 女儿线程 ```c void daughter_(void *parameter) { while (1) { rt_sem_take(&apple, RT_WAITING_FOREVER); rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER); num_apple--; rt_kprintf("吃掉苹果 %d\n", num_apple); rt_mutex_release(dynamic_mutex); rt_sem_release(&plate); rt_thread_mdelay(100); // 模拟消费时间 } } ``` 这个函数模拟女儿消费苹果的过程。每次消费一个苹果后,会打印当前苹果数量,并释放plate信号量以通知生产者线程。 ## 启动函数 ```c int start() { // 创建动态互斥量 dynamic_mutex = rt_mutex_create("dmutex", RT_IPC_FLAG_PRIO); // 初始化信号量 rt_sem_init(&plate, "plate", 1, RT_IPC_FLAG_PRIO); rt_sem_init(&apple, "apple", 0, RT_IPC_FLAG_PRIO); rt_sem_init(&orange, "orange", 0, RT_IPC_FLAG_PRIO); // 创建线程 dad = rt_thread_create("dad", dad_, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY - 1, THREAD_TIMESLICE); if (dad != RT_NULL) rt_thread_startup(dad); mom = rt_thread_create("mom", mom_, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY - 1, THREAD_TIMESLICE); if (mom != RT_NULL) rt_thread_startup(mom); daughter = rt_thread_create("daughter", daughter_, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if (daughter != RT_NULL) rt_thread_startup(daughter); son = rt_thread_create("son", son_, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if (son != RT_NULL) rt_thread_startup(son); return 0; } MSH_CMD_EXPORT(start, 经典同步问题); ``` 这个函数初始化互斥量和信号量,并创建和启动线程。函数通过MSH_CMD_EXPORT宏将start函数注册为RT-Thread的命令,允许在命令行中启动同步示例。 *** ## 总结 这个示例展示了如何使用RT-Thread的互斥量和信号量来解决多线程同步问题,确保多个线程安全访问共享资源。通过这些同步原语,可以有效避免竞争条件和死锁,提高程序的可靠性和稳定性。 *** ![结果图](https://oss-club.rt-thread.org/uploads/20240723/da9e6f3cc2cdbb052f76ec8cb06627b6.png.webp)
5
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
你好鸭
这家伙很懒,什么也没写!
文章
6
回答
1
被采纳
0
关注TA
发私信
相关文章
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
8
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部