当前位置: 技术问答>linux和unix
linux下线程里一个想不通的地方,贴上代码,高手帮忙~~ 在线
来源: 互联网 发布时间:2016-07-12
本文导语: void *clientThread::clientService(void *argParm) { argStruct *p; p=(argStruct*)argParm; int cSocket; char recvBuff[BUFFSIZE]; int recvSize , sendSize; char *recvData; char sendBufData[]="ACK"; //自动应答客户端 send...
void *clientThread::clientService(void *argParm)
{
argStruct *p;
p=(argStruct*)argParm;
int cSocket;
char recvBuff[BUFFSIZE];
int recvSize , sendSize;
char *recvData;
char sendBufData[]="ACK"; //自动应答客户端
sendSize=sizeof(sendBufData);
cSocket=p->m_socket;
if(p->buffQuee->head==NULL){
printf("argment is okn");}
else{
printf("argment err!n");}
//fcntl(cSocket, F_SETFL, O_NONBLOCK); //设置为非阻塞
while(1){
printf("Start to recv from client!n");
recvSize=recv(cSocket,recvBuff,BUFFSIZE,0);
if(recvSize>0){
recvData=(char*)malloc(sizeof(char)*recvSize+1);
if(recvData==NULL){
printf("malloc error!!");
continue; //设置成非阻塞模式时,未接收到数据recvSize=-1,网上查资料说此时连接依然保持,继续接受数据
}
else{
memcpy(recvData,recvBuff,recvSize);
}
recvData[recvSize]='';
//加入缓冲队列
pushQueue(recvData , cSocket , p->buffQuee);
printf("recvSize:%d,t %st%dn",recvSize,recvData,cSocket);
if(sendData(cSocket , sendBufData , sendSize) head==NULL){
printf("p->buffQuee->head is null!n");}
else{
printf("p->buffQuee->head is not null!n");
break;
}
////这段就是我观察传入结构体参数值的地方,在第一次循环的时候正常,p->buffQuee->head==NULL,但是无论有没有接收到数据,
////进入第二次循环这个值就被改变了,p->buffQuee->headNULL,这是为什么???
//////////////////////////////////////////////////////////////////////
sleep(1);
if(sendSizebuffQuee->head的值都被改变了,这是哪里出问题了?
线程外没有对p->buffQuee->head的操作,我想应该不会是在外部被改变
|
你的参数传进来的是个外部变量的指针 这个外部变量是在栈内的 第二次循环时 这个变量在外部已经被销毁了
你可以为这个外部变量分配堆内存 参数传进来 线程里面释放
你可以为这个外部变量分配堆内存 参数传进来 线程里面释放
|
在Linux下调用sleep是用时钟的,一个进程的时钟系统是有限制的.如果每个线程使用sleep,到了最大的数量,最终会进程会挂起
|
你又怎么知道线程外没有对该内存数据进行操作呢,
那如果不是外部改变这个数据,循环里面又没有对该数据进行赋值操作,
那么 p->buffQuee->head 为什么会被改变了呢,
难道是内存越界?
|
楼主的程序描述很不清楚,估计没人能给你解答的。
疑问:
1.你这个子线程需要功能是干什么呢?
看程序猜测,应该是根据传入的套接字,从描述符中接受数据,并将其写入缓冲队列中。另外有个线程一定从缓冲队列读取数据,并处理。
2.参数传入了pthread_mutex_t为什么在更改缓冲队列的操作中没有使用?
3.pushQueue函数为什么不帖代码出来。猜测,p->buffQuee->head = new char[接受字节个数+1]
4.代码
//////////////////////////////////////////////////////////////////////
if(p->buffQuee->head==NULL){
printf("p->buffQuee->head is null!n");}
else{
printf("p->buffQuee->head is not null!n");
break;
}
////这段就是我观察传入结构体参数值的地方,在第一次循环的时候正常,p->buffQuee->head==NULL,但是无论有没有接收到数据,
////进入第二次循环这个值就被改变了,p->buffQuee->headNULL,这是为什么???
//////////////////////////////////////////////////////////////////////
这段代码是干什么的?个人猜测是不是写的有些不对,应该是p->buffQuee->head==NULL成立表示缓冲中没有数据,程序应该break,继续从套接字内读取数据;否则应该sleep(1)
5.buffQuee结构或者对象的定义?
疑问:
1.你这个子线程需要功能是干什么呢?
看程序猜测,应该是根据传入的套接字,从描述符中接受数据,并将其写入缓冲队列中。另外有个线程一定从缓冲队列读取数据,并处理。
2.参数传入了pthread_mutex_t为什么在更改缓冲队列的操作中没有使用?
3.pushQueue函数为什么不帖代码出来。猜测,p->buffQuee->head = new char[接受字节个数+1]
4.代码
//////////////////////////////////////////////////////////////////////
if(p->buffQuee->head==NULL){
printf("p->buffQuee->head is null!n");}
else{
printf("p->buffQuee->head is not null!n");
break;
}
////这段就是我观察传入结构体参数值的地方,在第一次循环的时候正常,p->buffQuee->head==NULL,但是无论有没有接收到数据,
////进入第二次循环这个值就被改变了,p->buffQuee->headNULL,这是为什么???
//////////////////////////////////////////////////////////////////////
这段代码是干什么的?个人猜测是不是写的有些不对,应该是p->buffQuee->head==NULL成立表示缓冲中没有数据,程序应该break,继续从套接字内读取数据;否则应该sleep(1)
5.buffQuee结构或者对象的定义?
|
MFC中的Sleep函数原型为:
void Sleep( DWORD dwMilliseconds );
linux下的sleep函数原型为:
unsigned int sleep(unsigned int seconds);
MFC中的是微秒,linux下的是秒。linux下用微秒的线程休眠函数是:
void usleep(unsigned long usec);
或者用select函数+timeval结构也可以(最多精确到微秒),
或者用pselect函数+timespec可以精确到纳秒
所以在linux 下用sleep 可能是不安全的
void Sleep( DWORD dwMilliseconds );
linux下的sleep函数原型为:
unsigned int sleep(unsigned int seconds);
MFC中的是微秒,linux下的是秒。linux下用微秒的线程休眠函数是:
void usleep(unsigned long usec);
或者用select函数+timeval结构也可以(最多精确到微秒),
或者用pselect函数+timespec可以精确到纳秒
所以在linux 下用sleep 可能是不安全的
|
大家说这么多 不知道楼主问题解决了没有
楼主不如再明确一下思路 重新来写一遍
楼主不如再明确一下思路 重新来写一遍
|
//////////////////////////////////////////////////////////////////////
if(p->buffQuee->head==NULL){
printf("p->buffQuee->head is null!n");}
else{
printf("p->buffQuee->head is not null!n");
break;
}
////这段就是我观察传入结构体参数值的地方,在第一次循环的时候正常,p->buffQuee->head==NULL,但是无论有没有接收到数据,
////进入第二次循环这个值就被改变了,p->buffQuee->headNULL,这是为什么???
//////////////////////////////////////////////////////////////////////
楼主没有说这个。如果代码没有错的话,楼主的意思,应该是只要队列缓冲内有数据子线程就退出。
程序运行到“if(p->buffQuee->head==NULL){”处,而且如果为真的话,表示没有接收到数据,或者接收到数据已经被另一个子线程将数据取走并处理。
楼主,你把取数据并处理数据的线程屏蔽掉,并且接受数据的这个线程中退出时打印p->buffQuee->head,一定不是NULL。
if(p->buffQuee->head==NULL){
printf("p->buffQuee->head is null!n");}
else{
printf("p->buffQuee->head is not null!n");
break;
}
////这段就是我观察传入结构体参数值的地方,在第一次循环的时候正常,p->buffQuee->head==NULL,但是无论有没有接收到数据,
////进入第二次循环这个值就被改变了,p->buffQuee->headNULL,这是为什么???
//////////////////////////////////////////////////////////////////////
楼主没有说这个。如果代码没有错的话,楼主的意思,应该是只要队列缓冲内有数据子线程就退出。
程序运行到“if(p->buffQuee->head==NULL){”处,而且如果为真的话,表示没有接收到数据,或者接收到数据已经被另一个子线程将数据取走并处理。
楼主,你把取数据并处理数据的线程屏蔽掉,并且接受数据的这个线程中退出时打印p->buffQuee->head,一定不是NULL。