免费注册 查看新帖 |

Chinaunix

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

奇怪的问题,莫非这个就是Linux的信号灯惊群效应? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2004-12-10 16:39 |只看该作者

奇怪的问题,莫非这个就是Linux的信号灯惊群效应?

getqueue_status中的q_handle是队列未更新的时候的
  if (q_handle->;context_front == NULL)  //true

论坛徽章:
0
12 [报告]
发表于 2004-12-10 16:42 |只看该作者

奇怪的问题,莫非这个就是Linux的信号灯惊群效应?

原帖由 "twen345" 发表:
大哥,你的q_handle是队列未更新的时候的
  if (q_handle->;context_front == NULL)  //true


。。。我还是没明白你的意思,我在putqueue_status里,是把结点加入到了队列里后才sem_post的,按道理那边sem_wait成功后,进入队列肯定是不为空的,不知道你说的未更新是指的什么?能详细的说说吗

论坛徽章:
0
13 [报告]
发表于 2004-12-10 16:51 |只看该作者

奇怪的问题,莫非这个就是Linux的信号灯惊群效应?

原帖由 "elssann" 发表:


。。。我还是没明白你的意思,我在putqueue_status里,是把结点加入到了队列里后才sem_post的,按道理那边sem_wait成功后,进入队列肯定是不为空的,不知道你说的未更新是指的什么?能详细的说说吗

  1. struct queue_handle * q_handle = NULL;     //局部变量


  2.         if (q_id <= 0)
  3.         {
  4.                 return -1;
  5.         }

  6.         q_handle = (struct queue_handle *)q_id;


  7.     while (1)
  8.     {
  9.             if (sem_wait(&q_handle->;queue_sem) == 0) //阻塞/唤醒
  10.             {
  11.                     break;
  12.             }
  13.     }

  14.        
  15.         pthread_mutex_lock(&q_handle->;queue_lock);
  16.         if (q_handle->;context_front != NULL) //阻塞/唤醒后的q_handle不变

复制代码

论坛徽章:
0
14 [报告]
发表于 2004-12-10 17:06 |只看该作者

奇怪的问题,莫非这个就是Linux的信号灯惊群效应?

q_handle 虽然是局部变量,但是q_id是开始queue_create后返回的,

这样一来之后,指向的是在queue_create里分配的指针,
q_handle = (struct queue_handle *)q_id;

而我putqueue_status把结点是加在q_handle的成员指针队列里的,应该不存在未及时更新的问题吧?

论坛徽章:
0
15 [报告]
发表于 2004-12-10 17:15 |只看该作者

奇怪的问题,莫非这个就是Linux的信号灯惊群效应?

看了老半天也没有发现有问题。
能在putqueue_status下面加行代码试试吗?

assert(context);

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
16 [报告]
发表于 2004-12-10 17:18 |只看该作者

奇怪的问题,莫非这个就是Linux的信号灯惊群效应?

看不出来问题的所在,这些代码看来都是正常的
别的地方有没有内存非法访问?
跟踪一下,看什么时候context_front变成NULL了。

论坛徽章:
0
17 [报告]
发表于 2004-12-10 17:29 |只看该作者

奇怪的问题,莫非这个就是Linux的信号灯惊群效应?

原帖由 "yuxh" 发表:
看不出来问题的所在,这些代码看来都是正常的
别的地方有没有内存非法访问?
跟踪一下,看什么时候context_front变成NULL了。


这个问题太难跟踪了,
要几千个客户端连接上去收发数据大概1分钟后才出现。

调试了快2个星期了
郁闷死了
崩溃

论坛徽章:
0
18 [报告]
发表于 2004-12-10 17:39 |只看该作者

奇怪的问题,莫非这个就是Linux的信号灯惊群效应?

在putqueue_status函数的尾部
我已经改成这样,并在printf上设了断点,但是没有被断住,却还是出现老问题。
        if (context == NULL)
        {
                printf("\n\ncontext == NULL in putqueue_status2\n\n";
        }
       
       
        sem_post(&q_handle->;queue_sem);

论坛徽章:
0
19 [报告]
发表于 2004-12-10 17:48 |只看该作者

奇怪的问题,莫非这个就是Linux的信号灯惊群效应?

原帖由 "elssann" 发表:
q_handle 虽然是局部变量,但是q_id是开始queue_create后返回的,

这样一来之后,指向的是在queue_create里分配的指针,
q_handle = (struct queue_handle *)q_id;

而我putqueue_status把结点是加在q_handle..........

嗯,我搞错了,那就不知道是什么问题了,会不会和其它的函数有关呀?

论坛徽章:
0
20 [报告]
发表于 2004-12-10 17:56 |只看该作者

奇怪的问题,莫非这个就是Linux的信号灯惊群效应?

原帖由 "twen345" 发表:

嗯,我搞错了,那就不知道是什么问题了,会不会和其它的函数有关呀?


谢谢你,
这个问题我已经查了快2个星期了
还是没有查到,要郁闷死。。。

顺便问一句,。slackware的最新版的内核是多少?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP