Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
pipe
select
之前select死循环的问题查清楚了
发布于 2021-06-02 12:07:28 浏览:1299
订阅该版
问题可以见我之前发的贴子的描述,希望官方在下次发布时可以更改如下: 1.在poll_do里面增加pt->triggered = 0;这样可以避免在不是期待唤醒的时候可以挂起线程; 2.将pipe的机制可以改为read的时候不要唤醒写。原因如下: 应用程序使用pipe的框架如下: ![lw.png](https://oss-club.rt-thread.org/uploads/20210602/423694bbb50c433e1ae5a59150eb39e4.png) 线程1、2、3分别是3个独立的线程,优先级分别是25、26、27(25的优先级最大),其中有4到5对fd,此处只画了引起问题的这两对,通过分析内核pipe及poll处理代码,当pipe2里面为空时,假设此时线程26执行,在调用select(FD2[0])时,发现pipe2为空,挂起线程26,此时25线程ready,执行25线程,假设此时pipe1不为空,select(FD[0])成功返回,调用read(FD[0]),read的时候会唤醒FD[1]所在的线程,此时切换到线程26运行,但是此时poll_table里面的属性triggered被置位,造成了一种假象:线程26认为是FD2[1]唤醒的自己,接着poll,发现pipe2还是空,导致一直死循环。 ```c static int poll_do(struct pollfd *fds, nfds_t nfds, struct rt_poll_table *pt, int msec) { int num; int istimeout = 0; int n; struct pollfd *pf; int ret = 0; if (msec == 0) { pt->req._proc = RT_NULL; istimeout = 1; } while (1) { pf = fds; num = 0; pt->triggered = 0; for (n = 0; n < nfds; n ++) { ret = do_pollfd(pf, &pt->req); if(ret < 0) { /*dealwith the device return error -1 */ pt->req._proc = RT_NULL; return ret; } else if(ret > 0) { num ++; pt->req._proc = RT_NULL; } pf ++; } pt->req._proc = RT_NULL; if (num || istimeout) break; if (poll_wait_timeout(pt, msec)) istimeout = 1; } return num; } ```
查看更多
4
个回答
默认排序
按发布时间排序
mysterywolf
认证专家
2022-04-05
https://github.com/mysterywolf
https://github.com/RT-Thread/rt-thread/pull/5740
aozima
2021-06-02
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
赞! 感谢分享! 您也可以尝试学习发一个PR,直接修复。
小小李sunny
2021-06-02
这家伙很懒,什么也没写!
能深入去研究问题,给你点个赞!
flyboy
2021-10-13
Do my self();
有没有可以复现的代码,要不然这个问题不好提pr,不知道修没修好。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.3k
关于作者
NR1101
这家伙很懒,什么也没写!
提问
10
回答
6
被采纳
0
关注TA
发私信
相关问题
1
使用fifo通道读取数据select不返回
2
select不返回问题,昨天未描述清楚
3
pahomqtt 编译时提示 缺少pipe是什么情况?
4
接收数据不触发select
5
支持多个fd同时select,目前的rtt貌似不支持
6
非阻塞 socket
7
请问Kconfig中select 如何选择非bool值的config的值呢
8
tcpclient_select_sample 等待网络函数参数问题
9
请教 select问题
10
select poll bug 导致内存泄漏
推荐文章
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
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
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
篇文章
3
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部