免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: kaede_1
打印 上一主题 下一主题

[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

论坛徽章:
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
2 [报告]
发表于 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
3 [报告]
发表于 2014-08-15 17:11 |显示全部楼层
回复 3# 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
4 [报告]
发表于 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
5 [报告]
发表于 2014-08-18 09:17 |显示全部楼层
回复 8# giantchen


    。。。。
    我只是好奇想看一些信号丢失的现象。按照这段话的意思,按理说我应该已经错过了信号(sleep),为什么还能正常(没信号丢失)输出呢??

论坛徽章:
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
6 [报告]
发表于 2014-08-20 09:21 |显示全部楼层
回复 11# giantchen


    在thrd_1中有语句:
pthread_cond_wait(&qready,&qlock);  
这个不是你说的wait吗?

论坛徽章:
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
7 [报告]
发表于 2014-08-21 09:26 |显示全部楼层
回复 13# giantchen


    void *thrd_1(void *arg)  
{  
        sleep(5);
        pthread_mutex_lock(&qlock);  
        while(x<y)  
        {  
                pthread_cond_wait(&qready,&qlock);  
        }

你指的没调用是什么意思?

论坛徽章:
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
8 [报告]
发表于 2014-08-21 19:27 |显示全部楼层
回复 15# sjtu_smile


    Bingo ,犯二了,多谢哈

论坛徽章:
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-21 19:28 |显示全部楼层
回复 13# giantchen


    多谢指点
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP