C語言pthread_create傳遞帶多個參數的函數& pthread_join

pthread_create是類Unix操作系統(Unix、Linux、Mac OS X等)的創建線程的函數,頭文件在pthread.h中。函數的聲明如下:

int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,
(void*)(*start_rtn)(void*),void *arg);
//返回值:若成功則返回0,否則返回錯誤編號

參數
第一個參數爲指向線程標識符的指針。
第二個參數用來設置線程屬性。
第三個參數是線程運行函數的起始地址。
最後一個參數是運行函數的參數。

從第三個函數可以看到,傳入的函數參數需要爲void*類型。但是很多情況下需要線程處理的函數是多參數的。可以通過把參數封裝成結構體的方式來實現傳遞帶多個參數的函數。

struct fun_para
{
       var para1;//參數1
       var para2;//參數2
       .......
}

將這個結構體指針,作爲void *形參的實際參數傳遞

struct fun_para para;
pthread_create(&ntid, NULL, thr_fn,&para);

接着在線程的調用函數thr_fn中可以通過下面的方式使用通過para傳入的參數。

void *thr_fn(void *arg)
{
       fun_para *para;
       para = (fun_para *) arg;
       para->para1;//參數1
       para->para2;//參數2    
       ......
       //pthread_exit(0);
       return ((void *)0);
}

Additional Mark: 代碼中如果沒有pthread_join,主線程會很快結束從而使整個進程結束,從而使創建的線程沒有機會開始執行就結束了。加入pthread_join後,主線程會一直等待直到等待的線程結束自己才結束,使創建的線程有機會執行。
函數定義:

int pthread_join(pthread_t thread, void **retval);

描述 : pthread_join()函數,以阻塞的方式等待thread指定的線程結束。當函數返回時,被等待線程的資源被收回。如果線程已經結束,那麼該函數會立即返回。並且thread指定的線程必須是joinable的。
參數: thread: 線程標識符,即線程ID,標識唯一線程。retval: 用戶定義的指針,用來存儲被等待線程的返回值。
返回值 : 0代表成功。 失敗,返回的則是錯誤號。

    tmp1 = pthread_join(tid, &retval);
    if (tmp1 != 0)
    {
        printf("cannot join with thread1\n");
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章