找回密码
 注册
搜索
查看: 921|回复: 6

[讨论] Vxworks中信号量机制的问题

[复制链接]
发表于 2006-12-18 19:22:09 | 显示全部楼层 |阅读模式
在Vxworks中,有关信号量,我有一些疑问。
声明一个信号量:
SEM_ID rd_semid;
然后创建:
rd_semid=semBCreate(SEM_Q_PRIORITY,SEM_EMPTY);
taskSpawn("reader",100,0,200,(FUNCPTR)reader,0,0,0,0,0,0,0,0,0,0);
……
其中:
void reader()
{
    semTake(rd_semid,WAIT_FOREVER);
    printf("Reading  ....   ");
    semGive(rd_semid);
}
进程居然能够执行,并输出"Reading  ....   "。明明创建了一个初值为空的信号量,却能被使用,不理解。
发表于 2006-12-19 12:36:41 | 显示全部楼层
没有什么问题呀,创建成功了就可以使用呀。
点评回复

使用道具 举报

 楼主| 发表于 2006-12-19 13:43:48 | 显示全部楼层
该信号量的初值为0,我认为通过该信号量进行控制的资源应该一直被封锁直到有某个进程调用semGive(),将其释放,对应的资源才能被使用。但实际上我立即就能使用这个被封锁的资源,这一点不能理解。
点评回复

使用道具 举报

发表于 2006-12-19 15:08:57 | 显示全部楼层
大哥 我虽然不了解VWORKS

但是我也知道信号量的用法 是临界状态来得到信号量,如果信号量为零就等待或者阻塞

你的程序 建立一个信号量并将其附0 如果你接下来你有个得到信号量的请求 象LINUX中的DOWN函数一样 那么你就不能PRINTF了

而你的程序根本就没用信号量啊
点评回复

使用道具 举报

 楼主| 发表于 2006-12-19 15:26:05 | 显示全部楼层
void reader()[52RD.com]
{
    semTake(rd_semid,WAIT_FOREVER);[/COLOR]  /*这里就是调用信号量*/
    printf("Reading  ....   ");
    semGive(rd_semid);
}
点评回复

使用道具 举报

发表于 2006-12-20 10:14:55 | 显示全部楼层
理论上不应该执行printf,单步试试?
点评回复

使用道具 举报

 楼主| 发表于 2006-12-20 13:15:44 | 显示全部楼层
我发现创建该信号量后,如果先进行一次semTake(),然后第二次semTake()才能封锁资源。
所以,感觉其初值不是0,而是1
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-27 06:41 , Processed in 0.046544 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表