免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3496 | 回复: 14
打印 上一主题 下一主题

有关信号量。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-10 19:50 |只看该作者 |倒序浏览
几个线程在程序的同一个地方阻塞住,然后等另外一个线程唤醒(一次唤醒所有)。我想用信号量来实现,不想用条件变量,因为条件变量那个互斥锁对我的程序没用处。
信号量初始为0;
线程1:
sem_wait(sem);
线程2:
sem_wait(sem);
...
线程n:
sem_wait(sem);
唤醒线程:
sem_post(sem)
但是sem_post(sem)一次只能唤醒一个线程,sem_getvalue只能在sem非负的时候才返回正确的值,当sem为负时候就返回0.
实现这个功能最简单的方法是什么呢?
平台:Linux 2.6 c++.

[ 本帖最后由 scut_tang 于 2008-9-10 19:52 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-09-10 20:26 |只看该作者
这种情况用条件变量是最合适的
一定要用信号量,倒是可以用sys v信号量。
用用sys v信号量,等待的线程等待信号量变为0;触发事件线程把信号量设置为0值,就可以唤醒所有等待线程

论坛徽章:
0
3 [报告]
发表于 2008-09-10 20:29 |只看该作者
因为内存比较紧凑~所以不想花多个互斥锁~
那就是信号量只能用于一次唤醒一个线程?
我看下sys v信号量,谢谢了~~

论坛徽章:
0
4 [报告]
发表于 2008-09-10 20:31 |只看该作者
有几个线程阻塞就调用几次sem_post吧。

论坛徽章:
0
5 [报告]
发表于 2008-09-10 20:38 |只看该作者
原帖由 scutan 于 2008-9-10 20:31 发表
有几个线程阻塞就调用几次sem_post吧。


有可能都被同一个线程捕捉到

论坛徽章:
0
6 [报告]
发表于 2008-09-10 20:39 |只看该作者
但是不确定会有几个线程sem_wait。

论坛徽章:
0
7 [报告]
发表于 2008-09-10 20:41 |只看该作者
原帖由 ytl 于 2008-9-10 20:38 发表


有可能都被同一个线程捕捉到

什么情况下会发生?

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
8 [报告]
发表于 2008-09-10 20:51 |只看该作者
当你用信号量实现这个功能的时候,就会发现其思想和条件变量、互斥锁是一样的。Stevens在UNPV2讲解POSIX信号量的诸多功能后如此说过(小字部分,比较隐蔽,大概翻译了下原文,意思应该说明白了 ):
      作者并没有偏爱信号量。所有的同步原语:互斥锁,条件变量,信号量,读写锁,记录锁都有各自的适用范围。对于给定的应用我们可以有多种选择,但是需要注意它们的区别。互斥锁针对locking优化,条件变量针对waiting进行优化,信号量可以做到locking和waiting,但是它可能带来更多overhead和complication

论坛徽章:
0
9 [报告]
发表于 2008-09-10 20:55 |只看该作者
信号量可以做到locking?
看来我还得恶补下。。。shit.

论坛徽章:
0
10 [报告]
发表于 2008-09-10 21:00 |只看该作者
原帖由 scut_tang 于 2008-9-10 20:41 发表

什么情况下会发生?


系统不负责信号的平均分配,哪个线程枪得快哪个线程就捕捉到信号
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP