pthread_join

pthread_join

函式pthread_join用來等待一個執行緒的結束,執行緒間同步的操作。頭檔案 : #include <pthread.h>

函式定義: int pthread_join(pthread_t thread, void **retval);

描述 :pthread_join()函式,以阻塞的方式等待thread指定的執行緒結束。當函式返回時,被等待執行緒的資源被收回。如果執行緒已經結束,那么該函式會立即返回。並且thread指定的執行緒必須是joinable的。

參數 :thread: 執行緒標識符,即執行緒ID,標識唯一執行緒。retval: 用戶定義的指針,用來存儲被等待執行緒的返回值。

返回值 : 0代表成功。 失敗,返回的則是錯誤號。

基本介紹

  • 中文名:pthread_join
  • 頭檔案 :#include <pthread.h>
  • 參數:thread、retval:
  • 屬性:函式
函式套用,使用範例,

函式套用

linux中的套用
Linux中,默認情況下是在一個執行緒被創建後,必須使用此函式對創建的執行緒進行資源回收,但是可以設定Threads attributes來設定當一個執行緒結束時,直接回收此執行緒所占用的系統資源,詳細資訊查看Threads attributes。
其實在Linux中,新建的執行緒並不是在原先的進程中,而是系統通過一個系統調用clone()。該系統調用copy了一個和原先進程完全一樣的進程,並在這個進程中執行執行緒函式。不過這個copy過程和fork不一樣。 copy後的進程和原先的進程共享了所有的變數,運行環境。這樣,原先進程中的變數變動在copy後的進程中便能體現出來。
pthread_join的套用
pthread_join使一個執行緒等待另一個執行緒結束。
代碼中如果沒有pthread_join主執行緒會很快結束從而使整個進程結束,從而使創建的執行緒沒有機會開始執行就結束了。加入pthread_join後,主執行緒會一直等待直到等待的執行緒結束自己才結束,使創建的執行緒有機會執行。
所有執行緒都有一個執行緒號,也就是Thread ID。其類型為pthread_t。通過調用pthread_self()函式可以獲得自身的執行緒號。

使用範例

一個執行緒的結束有兩種途徑,一種是象我們下面的例子一樣,函式結束了,調用它的執行緒也就結束了;另一種方式是通過函式pthread_exit來實現。另外需要說明的是,一個執行緒不能被多個執行緒等待,也就是說對一個執行緒只能調用一次pthread_join,否則只有一個能正確返回,其他的將返回ESRCH 錯誤。
在Linux中,默認情況下是在一個執行緒被創建後,必須使用此函式對創建的執行緒進行資源回收,但是可以設定Threads attributes來設定當一個執行緒結束時,直接回收此執行緒所占用的系統資源,詳細資訊查看Threads attributes。
範例:
//signaltest.c
// 子執行緒阻塞,等待信號,然後輸出字元串
// 主執行緒從鍵盤錄入字元,給子執行緒發信號。
#include <stdio.h>#include <unistd.h>#include <signal.h>#include <pthread.h>#include <time.h>pthread_ttid;sigset_test;pthread_t tid;sigset_t set;void myfunc(){    printf("hello\n");}static void *mythread(void *p){    int signum;    while (1)    {        sigwait(&set, &signum);        if (SIGUSR1 == signum)            myfunc();        if (SIGUSR2 == signum)        {            printf("Iwillsleep2secondandexit\n");            sleep(2);            break;        }    }}int main(){    char tmp;    void *status;    sigemptyset(&set);    sigaddset(&set, SIGUSR1);    sigaddset(&set, SIGUSR2);    sigprocmask(SIG_SETMASK, &set, NULL);    pthread_create(&tid, NULL, mythread, NULL);    while (1)    {        printf(":");        scanf("%c", &tmp);        if ('a' == tmp)        {            pthread_kill(tid, SIGUSR1); //傳送SIGUSR1,列印字元串。        }        else if ('q' == tmp)        {            //發出SIGUSR2信號,讓執行緒退出,如果傳送SIGKILL,執行緒將直接退出。            pthread_kill(tid, SIGUSR2);            //等待執行緒tid執行完畢,這裡阻塞。            pthread_join(tid, &status);            printf("finish\n");            break;        }        else            continue;    }    return 0;}

相關詞條

熱門詞條

聯絡我們