免费注册 查看新帖 |

Chinaunix

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

请教一个多线程的问题... [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-22 16:09 |只看该作者 |倒序浏览
为什么我的压力测试程序让通讯进程死掉几个?是不是如下代码的线程没有退出?
我输入的第一个参数,也就是fork的数量是10,过一段时间也让通讯进程死了几个.
输入100和几百结果都一样.

如下是程序片断


int main(int argc, char **argv)
{
int iLoop, iPid;

iLoop = iPid = 0;

if(argc != 2)
{
fprintf(stderr, "Usage: %s + number!\n", argv[0]);
fflush(stderr);
return -1;
}

for(iLoop = 1; iLoop <= atoi(argv[1]); iLoop ++)
{
iPid = fork();
if(iPid == 0)
                {
                     
                        fflush(stdout);
                        AlarmSend();
                }
                else if(iPid < 0)
                {
                        fprintf(stderr, "FORK failed, errno = [%d], msg = [%s]!\n",
errno, strerror(errno));
                        fflush(stderr);
                        return -1;
                }
        }
        exit(0);
}
void AlarmSend()
{
        long lAlarm;

        lAlarm = 0L;
/*modified by bx*/

        while(1)
        {
/*   为什么这样的模式不行?               
signal(SIGALRM, alarm_send);
                *lAlarm = GetRam(0, 10);*
                alarm(lAlarm);
*/
                pthread_t pth;
                lAlarm = GetRamdom(0, 10);
                pthread_create(&pth,NULL,alarm_send,NULL);
                sleep(lAlarm);
        }
}
发送报文的代码略...
void alarm_send( void *haha){
...
return}

[ 本帖最后由 bluesgone 于 2008-1-22 16:12 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-01-22 18:17 |只看该作者

回复 #1 bluesgone 的帖子

顶一下,不然沉了...
运行环境:Linux,
alarm_send内部使用到大家公用的消息队列,XXXQ,
而守护进程发现XXXQ内有东西,就会往另外一个机器发送
报文.但是,后来发现守护程序挂了,不知道为什么,是不是
压力真的起到了效果?谢谢:wink:

论坛徽章:
0
3 [报告]
发表于 2008-01-23 12:27 |只看该作者
void alarm_send( void *haha){

...
signal(SIGALRM, alarm_send);
                *lAlarm = GetRam(0, 10);*
                alarm(lAlarm);

return}

内部重设信号。。。

论坛徽章:
0
4 [报告]
发表于 2008-01-23 13:42 |只看该作者
不是这个事情吧。linux需要重新设定么?
我怎么记得linux的signal就是用的sigaction的语义来做的。
重设没有意义。

论坛徽章:
0
5 [报告]
发表于 2008-01-23 13:51 |只看该作者
哦,也许信号无需重设,但是要重新alarm(lAlarm);

论坛徽章:
0
6 [报告]
发表于 2008-01-24 14:42 |只看该作者
原帖由 ivhb 于 2008-1-23 13:42 发表
不是这个事情吧。linux需要重新设定么?
我怎么记得linux的signal就是用的sigaction的语义来做的。
重设没有意义。


哦,用signal函数不对,应该用signaction来做是吧?
哦,也许信号无需重设,但是要重新alarm(lAlarm);

重新alarm?我的alarm是否应该在signal函数的前面写?谢谢.

我自己再试验几次.多谢你们的回复,某实感激不尽,你们的大恩大德,今生无法报答.
只望来世做牛左马....省略了50万字.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP