項目之所以選擇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; }