很奇怪的问题 ! semTake(sem, WAIT_FOREVER) 始终无法阻塞 !

zxr65 2008-04-13 12:58:57
do
{
...
semTake(sem, WAIT_FOREVER);
...
} while(1);

sem 是通过 semCCreate 创建的 counter 信号量。
semTake 第一次可以阻塞在 sem 上等待, 也就是 sem 第一次被 semGive 后 semTake 成功, 但是以后就无法阻塞在 sem 上 semTake 立即返回并且成功返回 0 即使 sem 没有被 semGive (我每次循环把 counter 值打出来多是 0 ) ; 本来应该阻塞的可是就是不阻塞。
我总是能遇到很奇怪的问题, 郁闷死了 !
希望能给我点建议, 非常感谢 !
...全文
2631 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
popusan 2008-10-09
  • 打赏
  • 举报
回复

信号量有几种,一种是互斥类型的信号量,这样的话肯定可以阻塞的。还有一种计数型的,也就是你使用semCCreat创建的,可能需要你指定最多可使用的信号数目。换句话来说,互斥型的信号量用来保护唯一的资源被单独使用,计数型的用来保护多个资源的互斥使用。如果你的计数型SEM最大数目比1多,那么当然不会阻塞。但是我的解释好像不能满足第一次的使用情况!看来还需要对VxWorks的信号量机制的多多了解。
qiu1668 2008-05-12
  • 打赏
  • 举报
回复
请先确认几个问题:
1、counter信号量创建的参数是多少?
2、take信号量和give信号量所属的任务优先级?
3、用semShow在shell下察看信号量变化
fred_56 2008-05-07
  • 打赏
  • 举报
回复
你的信号量是什么类型的?如果是Mutual-Exclusion Semaphores(semMCreate)的就肯定可以Recursive take了
helenhf 2008-04-17
  • 打赏
  • 举报
回复
直接写个死循环看看

// 先创建semaphore
while(1)
{
semTake(sem, WAIT_FOREVER);
printf("get sem");
}
然后在shell下手动敲semGive

如果可以阻塞那肯定是楼主程序的问题
japee_jew 2008-04-14
  • 打赏
  • 举报
回复
多学习 AT指令介绍及用法 http://www.japee.com.cn/jew/pages/JPF2023_Index.aspx?SERIAL_ID=1DDA0AB50EE0BB5C&id=241AEFB635A6AF69

2,184

社区成员

发帖
与我相关
我的任务
社区描述
xworks是美国 Wind River System 公司( 以下简称风河公司 ,即 WRS 公司)推出的一个实时操作系统。
社区管理员
  • VxWorks开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧