C語言pthread_create傳遞帶多個引數的函式& pthread_join
阿新 • • 發佈:2019-02-06
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,¶);
接著線上程的呼叫函式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");
}