免费注册 查看新帖 |

Chinaunix

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

UNIX多线程时的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-11 17:18 |只看该作者 |倒序浏览
KPServer kTmp;       
                       
        for(int i=0;i < g_kSgipUser.iMaxConnNum; ++i)
        {
                //init
                //int * test=&i;
                pthread_mutex_init(&kTmp.mUserOrder,NULL);
                pthread_mutex_init(&kTmp.mUserOrderResp,NULL);
                //pthread_mutex_init(&kTmp.mReportResp,NULL);
                //pthread_mutex_init(&kTmp.mReport,NULL);
                pthread_mutex_init(&kTmp.mSgipConn,NULL);
                pthread_cond_init(&kTmp.cSgipConn,NULL);
                kTmp.kSocketConn.socketFD = 0;
                kTmp.kSocketConn.iStatus = 0;
                kTmp.kSgipConn.iStatus = 0;

                //create pthread
                PDeal(i,g_kSgipUser.iDelNum,kTmp);                //处理
               
                sprintf( sBuffer,"main:业务处理线程组[ %d ]创建成功...!",i);
                DebugInfo( sBuffer, kLogFile );
               
                nRetThread=pthread_create(&kTmp.ptSend,NULL,PSend,(void*)i);        //发送
                if(nRetThread!=0){
                                        printf("系统创建线程数过多,请改小最大连接的数目\n");
                }else{
                                        sprintf( sBuffer,"main:发送线程[ %d ]创建成功...!",i);
                                        DebugInfo( sBuffer, kLogFile );
                }
               
                nRetThread=pthread_create(&kTmp.ptRecv,NULL,PRecv,(void*)i);        //接收
                if(nRetThread!=0){
                                        printf("系统创建线程数过多,请改小最大连接的数目\n");
                }else{
                                        sprintf( sBuffer,"main:接收线程[ %d ]创建成功...!",i);
                                        DebugInfo( sBuffer, kLogFile );                                       
               
                }
               
                g_vecServer.push_back(kTmp);                                               
        }


void PDeal(const int id,const int iDeal, KPServer& kPServer)
{
        pthread_t pid;
//        int child_id;
        //child_id=s_Deal_id+id;
        int i;
        //int * test=&id;
       
                if(id==0){
                        for( i = 0;i< iDeal;i++){
                                //printf("s_Deal_id==id==0======%d\n",id+i);
                                //int t=id+i;
                                pthread_create(&pid,NULL,PDealBatch,(void *)(id+i));
                                kPServer.vecPtDeal.push_back(pid);
                               
                        }
                        s_ChildIDBase=id+i;
                }
                else{
                        for( i = 0;i< iDeal;i++){
                                //printf("s_Deal_id========%d\n",s_ChildIDBase+i);
                                //int m=s_ChildIDBase+i;
                                int ret=pthread_create(&pid,NULL,PDealBatch,(void *)(s_ChildIDBase+i));
                                        if(ret!=0){
                                                printf("系统创建线程数过多,请改小业务处理线程的数目\n");
                                        }else{
                                                kPServer.vecPtDeal.push_back(pid);
                                        }
                               
                               
                                }
                        s_ChildIDBase=s_ChildIDBase+i;
                       
                }
               
        //s_ChildIDBase=child_id+i;
       

       
}

以上代码这是公司的老代码
我认为有问题
就是这个pthread_create(&kTmp.ptRecv,NULL,PRecv,(void*)i)
的参数,kTmp这个变量是main里声明的,创建多个线程时指向同一地址
而这个void PDeal(const int id,const int iDeal, KPServer& kPServer)里的
pthread_t pid;
这个变量会不会在线程函数里超过作用域,它在调用函数里就一普通栈变量
我觉得有问题。但现在程序看起来正常,老大不让改。

论坛徽章:
0
2 [报告]
发表于 2008-11-11 17:43 |只看该作者
你改下试试没关系吧

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
3 [报告]
发表于 2008-11-11 17:49 |只看该作者

回复 #1 rocking2807 的帖子

主要看后续如何使用那几个变量了

KPServer kTmp;  在main中定义,如果主线程不退出,就没问题。

void PDeal(const int id,const int iDeal, KPServer& kPServer)里的
pthread_t pid;只是为了调用pthread_create而定义的变量,没有把pid的地址传入新建线程,同样没影响
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP