项目之所以选择pthread是因为dispatch的block块实在是难啃,弄不明白,但凡传进去局部的字符串就会出错,只好使用pthread,使用方法也很简单,没有使用同步和异步所以,我记录的也没有包含这些。
1. 首先传进去的数据如果比较多,请使用struct,如果传进去的是一个字符数组,而且比较大,请把这个字符串数组static化吧,不然调用内存还是会出错的。
2. 先调用 pthread_create,函数格式看man 手册,需要什么头文件,都有介绍,我的如下:
pthread_t sendThread,recvThread; arg_type args; args.arg_cid = cId; args.arg_buffer = buffer; args.arg_recvSock = recvSock; args.recvAddr = recvAddr; args.arg_sendSock = sendSock; args.loop = loop; args.loopCount = loopCount; args.nSearchIDNum = nSearchIDNum; args.callBack= callBack; pthread_create(&sendThread, NULL, sendThreadFunction, &args); pthread_create(&recvThread, NULL, recvThreadFunction, &args);
其中buffer比较大,已经static化了,没有问题,如果没有static化,在发送数据一段时间后就出错。
3. 调用thread,比较喜欢pthread_detach
pthread_detach(sendThread); pthread_detach(recvThread);
4. 线程读取参数如下:
void* recvThreadFunction(void* arg){ arg_type args =*((arg_type*)arg); uint8_t *cId = args.arg_cid; int recvSock = args.arg_recvSock; sockaddr_in recvAddr = args.recvAddr; int nSearchIDNum = args.nSearchIDNum; pFun_dealID callBack = args.callBack; int res =0; while(endFlag!=1&&res!=-1) res=recvMulti(cId, recvSock, recvAddr, nSearchIDNum, callBack); close(recvSock); return 0; }
线程结束请关闭socket这是必要的。
最新修改,线程如果运行太久,socket所在内存可能发生改变,修改如下:上面的线程代码改为 :
void* recvThreadFunction(void* arg){ arg_type args =*((arg_type*)arg); static uint8_t *cId = args.arg_cid; static int recvSock = args.arg_recvSock; static sockaddr_in recvAddr = args.recvAddr; static int nSearchIDNum = args.nSearchIDNum; static pFun_dealID callBack = args.callBack; int res =0; while(endFlag!=1&&res!=-1) res=recvMulti(cId, recvSock, recvAddr, nSearchIDNum, callBack); close(recvSock); return 0; }