免费注册 查看新帖 |

Chinaunix

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

[C] Linux下条件变量的信号丢失指的是什么? [复制链接]

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-15 08:55 |只看该作者 |倒序浏览
不同于信号量,条件变量没有计数值,也不占据内存空间,线程 A 必须在 B 发送信号之前开始等待。如果 B 在 A 执行等待操作之前发送了信号,这个信号就丢失了,同时 A会一直阻塞直到其它线程再次发送信号到这个条件变量。

在帖子上看到了上面这段好,这个信号丢失指的是什么?
是指B发送信号时,A为处于等待状态,那么A会死等,直到下一个信号发送?
有个小例子如下
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>  
  4. #include <pthread.h>  
  5. pthread_cond_t qready = PTHREAD_COND_INITIALIZER;    //初始构造条件变量  
  6. pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;    //初始构造锁  
  7. pthread_t tid1,tid2,tid3;  
  8.              
  9. int x = 10;  
  10. int y = 20;  
  11.                      
  12.                      
  13. void *thrd_1(void *arg)  
  14. {  
  15.         sleep(5);
  16.         pthread_mutex_lock(&qlock);  
  17.         while(x<y)  
  18.         {  
  19.                 pthread_cond_wait(&qready,&qlock);  
  20.         }  
  21.         pthread_mutex_unlock(&qlock);  
  22.         printf("1\n");
  23.         sleep(1);  
  24. }  

  25. void *thrd_2(void *arg)  
  26. {  
  27.         pthread_mutex_lock(&qlock);  
  28.         x = 20;  
  29.         y = 10;  
  30.         printf("Has change x and y\n");

  31.         pthread_mutex_unlock(&qlock);  
  32. if(x > y)  
  33. {  
  34.         pthread_cond_signal(&qready);  
  35. }  
  36.         printf("2\n");
  37. }  
  38.   
  39. void *thrd_3(void *arg)  
  40. {  
  41. pthread_join(tid1,NULL);  
  42. printf("3\n");
  43. }  

  44. int main(int argc,char **argv)  
  45. {  
  46. int err;  
  47. err = pthread_create(&tid1,NULL,thrd_1,NULL);  
  48. if(err != 0)  
  49. {  
  50.         printf("pthread 1 create error\n");
  51. }  
  52. err = pthread_create(&tid2,NULL,thrd_2,NULL);  
  53. if(err != 0)  
  54. {  
  55.         printf("pthread 2 create error\n");
  56. }  
  57. err = pthread_create(&tid3,NULL,thrd_3,NULL);  
  58. if(err != 0)  
  59. {  
  60.         printf("pthread 3 create error\n");
  61. }  
  62. while(1)  
  63. {  
  64. sleep(1);  
  65. }  
  66. return 0;  

  67. }
复制代码
但执行结果却是:
Has change x and y
2
1
3

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2014-08-15 09:00 |只看该作者
就是A在没执行中时, B发出信号, 将会因为无人处理而丢失~。

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
3 [报告]
发表于 2014-08-15 13:27 |只看该作者
这个条件变量太恶心了
这几天就刚好遇到这个丢失问题。。。。

假设有4个线程在等同一个条件变量,但是链表中有10个节点,所以会发送10次信号
但是这个4个线程,可能因为正在处理数据而错过其它的几个信号,这就算是丢失了吧

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
4 [报告]
发表于 2014-08-15 17:07 |只看该作者
回复 2# folklore


    恩 情况是这么个情况,不过我想问得是:
    我在A中sleep 5s,B 发送信号时,A在sleep,是不是说此时A 就错过这个信号,而持续等待。
    如果是这样的话,为什么会有那个输出??

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
5 [报告]
发表于 2014-08-15 17:11 |只看该作者
回复 3# Dannysd


    你真的有丢失信号的情况?
    那我这个为什么没丢失,还能继续输出?

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
6 [报告]
发表于 2014-08-15 22:17 |只看该作者
回复 5# kaede_1
  1. while(1) {
  2.     pthread_cond_signal(&qready);
  3. }
复制代码

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
7 [报告]
发表于 2014-08-15 22:28 |只看该作者
我能说你们忘了把pthread_cond_signal包在lock中间了吗?

论坛徽章:
0
8 [报告]
发表于 2014-08-16 02:20 |只看该作者
kaede_1 发表于 2014-08-14 16:55
不同于信号量,条件变量没有计数值,也不占据内存空间,线程 A 必须在 B 发送信号之前开始等待。如果 B 在  ...


你这个程序完全没问题,不会出现死锁。

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
9 [报告]
发表于 2014-08-18 09:14 |只看该作者
回复 6# Dannysd


    哥们,我想要的现象是信号丢失,为什么我这段程序没有信号丢失??

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
10 [报告]
发表于 2014-08-18 09:17 |只看该作者
回复 8# giantchen


    。。。。
    我只是好奇想看一些信号丢失的现象。按照这段话的意思,按理说我应该已经错过了信号(sleep),为什么还能正常(没信号丢失)输出呢??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP