關於線程pthread的簡單使用方法


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM