- 论坛徽章:
- 0
|
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;
这个变量会不会在线程函数里超过作用域,它在调用函数里就一普通栈变量
我觉得有问题。但现在程序看起来正常,老大不让改。 |
|