- 论坛徽章:
- 0
|
20可用积分
int liFrom = 0;
int liTo = 0;
int liSocket = 0;
int liFileLen = 0;
int liSCode = 0;
int liRet = -1;
InfoHead *lpHt = static_cast<InfoHead*>(avOpt);
if (lpHt == NULL)
{
cout<<"lpHt is NULL"<<endl;
return NULL;
}
liFrom = lpHt->siFrom;
liTo = lpHt ->siTo;
liSocket = lpHt->spHp->ConnectSrv();
if (liSocket == 0)
{
return NULL;
}
cout<<"liForm:"<<liFrom<<" liTo:"<<liTo<<endl; //////////////////////////////////1
liRet = lpHt->spHp->SendRequest(liSocket, liFrom, liTo);/////2
if (liRet != 0)
{
cout<<"send request failed!!"<<endl;
tcp_close(liSocket);
return NULL;
}
liRet = lpHt->spHp->ReceiveResp(liSocket, liFileLen, liSCode);
if (liRet != 0)
{
cout<<"send request failed!!"<<endl;
tcp_close(liSocket);
return NULL;
}
return NULL;
}
我开启五个线程运行时,就发现这些局部变量全部是一样的值了, 把每个线程sleep 2s后再开启的话就可以了
由此可以看出是变量访问冲突了!!
也就是线程互斥
此有几点疑问:
难道这几个线程的局部变量全部是共享的??
如果用线程互斥的话,这五个线程还同时运行吗??多线程同时运行还有意义吗??
对线程认识不深,请各位指点!! |
最佳答案
查看完整内容
大胆的猜测下你的线程创建和参数使用方式:for (i = 0; i < threadNum; i++) { avOpt->siFrom = f(i); /* siFrom是i的函数,即f(i) */ avOpt->to = g(i); /* 解释同上 */ /* 其它初始化部分 ... */ assert(pthread_create(&tid, NULL, worker, avOpt) == 0);}如此形式的参数使用方式,就会有问题,因为calling thread的pthread_create返回继续运行和线程worker开始运行已经分别是独立的过程,由系 ...
|