Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
信号量_semaphore
rt_thread的二值信号量,先后被两个线程take,为何不是我预想的结果?
发布于 2020-11-18 16:42:46 浏览:1389
订阅该版
![创建信号量和线程.jpg](/uploads/20201118/6e72cc29192a4d7c3075a7a9ff3c3b12.jpg) ![输出结果.png](/uploads/20201118/08647266f9cf129951921d18fbfc54ac.png) 创建信号量为优先级优先方式,不是FIFO方式。 receive线程优先级是3,比较低。 send线程优先级是2,比较高。 程序跑起来,receive线程会先跑到take信号量而阻塞。随后到send线程释放信号量并且继续跑到send的take信号量,这时候send的优先级比receive高,为何跑回receive来take信号量并打印Sucessful了呢?
查看更多
yangjie
认证专家
2020-11-18
hello
线程优先级抢占决定的哪个线程先运行。 先解释运行过程: main 函数 优先级 20 ,先创建一个优先级3并启动(优先级高),之后就会切换到优先级3的线程,优先级3的线程挂起之后,才会运行main,接着创建优先级为2的线程。 ``` 你说的这句话有误: 程序跑起来,receive线程会先跑到take信号量而阻塞。随后到send线程释放信号量并且继续跑到send的take信号量,这时候send的优先级比receive高,为何跑回receive来take信号量并打印Sucessful了呢? 应该为: 程序跑起来,receive线程会先跑到take信号量,此时不会阻塞,因为你初始化为1,会马上获取到信号量,然后向下运行,在LV3 delay的时候,会切换到mian创建send线程。后面的逻辑你自己可以理理。 ``` 如果你创建的两个线程优先级都低于20的,例如 25 26,那么运行过程就是:运行main,创建25 的线程并启动,优先级25低所以不切换,接着创建优先级为26 的线程并启动,main 线程运行结束退出。接下来开始调度系统中剩余的线程(包含 25 26),此时哪个优先级高就先运行哪个。
3
个回答
默认排序
按发布时间排序
踩姑娘的小蘑菇
2020-11-18
这家伙很懒,什么也没写!
如果想测试信号量的take优先级机制,通用做法应该是让这两个线程一起阻塞在take函数,第3个线程去释放,这个能测到实际能获取到的线程
lijinqiao2010
2020-11-19
这家伙很懒,什么也没写!
我知道原因了,原来是释放就马上被take走了,但因为take走的线程因为优先级不够无法调度成功,但却能take走,所以依然在高等级线程运行,当高等级线程遇到take时,但由于已经被低等级线程take走了(之前我以为低等级线程没有take成功),造成高等级线程堵塞,然后发生了调度,然后回到了已经就绪的低等级线程打印了。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.4k
关于作者
lijinqiao2010
这家伙很懒,什么也没写!
提问
2
回答
1
被采纳
0
关注TA
发私信
相关问题
1
怎样可以将信号量复位为初始值
2
rt_sem_take 引起段错误
3
生产者消费者中是否可以使用一个事件集来代替多个二值信号量?
4
看RTT文档,不太懂有关信号量的死锁问题
5
这样使用UART接收一帧数据的方法是否可行
6
一对多线程间通信的问题
7
动态内存堆 保护全局变量lfree,为什么用信号量而不是互斥信号量
8
二值信号量的使用问题
9
USART1_IRQHandler串口中断接收问题
10
开发文档semaphore_sample.c有问题
推荐文章
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组件
最新文章
1
如何在master上的BSP中添加配置yml文件
2
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
3
RT-Thread 发布 EtherKit开源以太网硬件!
4
rt-thread使用cherryusb实现虚拟串口
5
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
热门标签
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
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部