Pthread 与 bsd socket 结合的问题,如何让子线程结束?

用pthread 创建了个线程,负责收网络数据。
pthread_attr_init(&mThreadAttr);
pthread_attr_setdetachstate(&mThreadAttr,PTHREAD_CREATE_JOINABLE);

pthread_create(&mTcpThread, &mThreadAttr, CCTcpClient::recieveThread, this);
recieveThread (){
while(true) {
。。。。
pthread_testcancel();
int retCode=that->mSocket.Recv(that->mRecvBuf+that->mRecvSize,SOCKET_BUFFER-that->mRecvSize);
pthread_testcancel();
。。。。
}
pthread_exit(NULL);
}

主线程里退出函数
close() {

pthread_cancel(mTcpThread);
pthread_join(mTcpThread,NULL);
}
目的是想让子线程结束。但因为子线程中 mSokcet.Recv()函数阻塞了。 pthread_cancel(mTcpThread).似乎无效。
主线程就卡在 pthread_join()了。

不知怎么解决这个问题。有人可以解答一下吗?谢谢。

难道这个问题太弱智?都没人理。
其实可以 cancel前把socket关掉解决,比较暴力就是了。
不过最终还是用非阻塞单线程select模型做了。