1. 程式人生 > >C語言pthread_create傳遞帶多個引數的函式& pthread_join

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");
    }