3040|7

84

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于信号量的问题 [复制链接]

小弟有个测试程序,是用信号量来激活进程的,如下:
SEM_ID  binarySem;
int semCount;
void semGive()
{
     int count;
     for(count=0;count<6;count++)
     {
            printf("\ngive sem\n");
            semGive(binarySem);
     }
}

void semTake()
{
       FOREVER
       {
              semTake(binarySem,WAIT_FOREVER);
              printf("\nsem take %d\n",++semCount);
       }
}
void semTest()
{
      binarySem=semCreate(,,...);
      semCount=0;
      taskSpawn("semTake", 100, 0x100, 2000, (FUNCPTR)semTake, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
      taskSpawn("semGive", 90, 0x100, 2000, (FUNCPTR)semGive, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);      
}

各位达人想必已经看出这个小程序的目的了,就是一个高优先级的进程先给出6个信号量,然后低优先级的进程在得到信号量后就打印。
可是为什么结果却是:
give sem
give sem
give sem
give sem
give sem
give sem
sem take 1
sem take 2
-----------------
也就是说,任务semTake只得到了两个信号量了?为什么不是1个或者6个了???
而且实际上不管任务semGive给了多少信号量,也就说不管这个变量count设为任何大于等于3的数,任务semTake都只打印两次!
这是怎么回事了??



最新回复

很简单的问题,看一看Bianry Semapore的实现不就知道了。刚开始时你的第低级别任务PEND在信号量上,高级别任务Give时判断有PENDING的任务就把这个任务设置为READY了,后面再运行时把semId->events.taskId设置为零,这种情况下Binary Semaphore的含义是“满”。 高级别的任务执行完6次循环之后你的低级别任务得到执行,等于semTake成功返回,再循环时由于semId->events.taskId为NULL则设置为taskIdCurrent直接成功返回,这就是第二次了。后面再运行时由于信号量是空,就阻塞了。  详情 回复 发表于 2009-2-24 15:35
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我使用我的工程测试了,运行正常,可能是你的设备或工程有问题。
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
??怎么会了??我用目标虚拟机和vmware上运行的都是上面的结果啊??!那请问你的结果是什么啊?
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
??怎么会了??我用目标虚拟机和vmware上运行的都是上面的结果啊??!那请问你的结果是什么啊?
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(初级)

5
 
测试代码有问题,你使用的是二进制信号量,不是计数信号量,将信号量换成计数的试试。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

6
 
二进制信号量释放多次和释放一次的效果一样,你这边semTake任务优先级低,应该是信号量被释放了多次后,take任务
才去获取的
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

7
 
这个我也是这么想的!但是这样应该是打印一个sem take 1啊!为什么会打印两次了??
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

8
 
很简单的问题,看一看Bianry Semapore的实现不就知道了。刚开始时你的第低级别任务PEND在信号量上,高级别任务Give时判断有PENDING的任务就把这个任务设置为READY了,后面再运行时把semId->events.taskId设置为零,这种情况下Binary Semaphore的含义是“满”。
高级别的任务执行完6次循环之后你的低级别任务得到执行,等于semTake成功返回,再循环时由于semId->events.taskId为NULL则设置为taskIdCurrent直接成功返回,这就是第二次了。后面再运行时由于信号量是空,就阻塞了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表