多執行緒實現多工二

千鋒教育官方發表於2019-09-17

執行緒的常用函式

4)回收執行緒資源

所需標頭檔案:

#include <pthread.h>

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

 

功能:

等待執行緒結束(此函式會阻塞),並回收執行緒資源,類似程式的 wait() 函式。如果執行緒已經結束,那麼該函式會立即返回。

引數:

thread:被等待的執行緒號。

retval:用來儲存執行緒退出狀態的指標的地址。

返回值:

成功:0

失敗:非 0

示例程式碼如下:

#include <stdio.h>  

#include <unistd.h>  

#include <pthread.h>  

  

void *thead(void *arg)  

{  

    static int num = 123; //靜態變數  

      

    printf("after 2 seceonds, thread will return\n");  

    sleep(2);  

      

    return #  

}  

  

int main(int argc, char *argv[])  

{  

    pthread_t tid;  

    int ret = 0;  

    void *value = NULL;  

      

    // 建立執行緒  

    ret = pthread_create(&tid, NULL, thead, NULL);  

    if(ret != 0){ //建立失敗  

        perror("pthread_create");  

    }  

      

    // 等待執行緒號為 tid 的執行緒,如果此執行緒結束就回收其資源  

    // &value儲存執行緒退出的返回值  

    pthread_join(tid, &value);   

      

    printf("value = %d\n", *( (int *)value ) );  

      

    return 0;  

}  

執行結果如下:

建立一個執行緒後應回收其資源,但使用 pthread_join() 函式會使呼叫者阻塞,Linux 還提供了非阻塞函式 pthread_detach() 來回收執行緒的資源。

 

所需標頭檔案:

#include <pthread.h>

int pthread_detach(pthread_t thread);

 

功能:

使呼叫執行緒與當前程式分離,分離後不代表此執行緒不依賴與當前程式,執行緒分離的目的是將執行緒資源的回收工作交由系統自動來完成,也就是說當被分離的執行緒結束之後,系統會自動回收它的資源。所以,此函式不會阻塞。

引數:

thread:執行緒號。

返回值:

成功:0

失敗:非 0

注意,呼叫 pthread_detach() 後再呼叫 pthread_join() , pthread_join() 會立馬返回,呼叫失敗。

示例程式碼如下:

#include <stdio.h>  

#include <unistd.h>  

#include <pthread.h>  

  

void *thead(void *arg)  

{  

    int i;  

    for(i=0; i<5; i++)  

    {  

        printf("I am runing\n");  

        sleep(1);  

    }  

      

    return NULL;  

}  

  

int main(int argc, char *argv[])  

{  

    int ret  = 0;  

    pthread_t tid;  

      

    ret = pthread_create(&tid, NULL, thead, NULL);  

    if(ret!=0){  

        perror("pthread_create");  

    }  

      

    pthread_detach(tid); // 執行緒分離,不阻塞  

      

    // 立馬返回,呼叫失敗  

    int flag = pthread_join(tid, NULL);  

    if(flag != 0){  

        printf("join not working\n");  

    }  

      

    printf("after join\n");  

    sleep(3);  

    printf("I am leaving\n");  

      

    return 0;  

}  

 

執行結果如下:

 

5)執行緒退出

在程式中我們可以呼叫 exit() 函式或 _exit() 函式來結束程式,在一個執行緒中我們可以透過 pthread_exit() 在不終止整個程式的情況下停止它的控制流。

所需標頭檔案:

 

#include <pthread.h>

void pthread_exit(void *retval);

 

功能:

退出呼叫執行緒。一個程式中的多個執行緒是共享該程式的資料段,因此,通常執行緒退出後所佔用的資源並不會釋放。

引數:

retval:儲存執行緒退出狀態的指標。

返回值:

示例程式碼如下:

#include <stdio.h>  

#include <unistd.h>  

#include <pthread.h>  

  

void *thread(void *arg)  

{  

    static int num = 123; //靜態變數  

    int i = 0;  

    while(1)  

    {  

        printf("I am runing\n");  

        sleep(1);  

        i++;  

        if(i==3)  

        {  

            pthread_exit( (void *)&num );  

            // return #  

        }  

    }  

      

    return NULL;  

}  

  

int main(int argc, char *argv[])  

{  

    int ret  = 0;  

    pthread_t tid;  

    void *value  = NULL;  

      

    ret = pthread_create(&tid, NULL, thread, NULL);    

    if(ret!=0){  

        perror("pthread_create");  

    }  

      

    pthread_join(tid, &value);  

      

    printf("value = %d\n", *(int *)value );  

      

    return 0;  

}  

 

執行結果如下:

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69914734/viewspace-2657289/,如需轉載,請註明出處,否則將追究法律責任。

相關文章