1. 程式人生 > >三十七、Linux 執行緒——執行緒清理和控制函式、程序和執行緒啟動方式比較、執行緒的狀態轉換

三十七、Linux 執行緒——執行緒清理和控制函式、程序和執行緒啟動方式比較、執行緒的狀態轉換

37.1 執行緒清理和控制函式

1 #include <pthread.h>
2 
3 void pthread_cleanup_push(void (* rtn)(void *), void *arg);
4 void pthread_cleanup_pop(int execute);
  • 函式引數
    • rtn:清理函式指標
    • arg:呼叫清理函式傳遞的引數
    • execute:值 1 時,執行執行緒清理函式;值 0 時,不執行執行緒清理函式
  • 返回值
    • 成功,返回 0;否則,返回錯誤編號
  • 觸發執行緒呼叫清理函式的工作
    • 呼叫 pthread_exit
    • 響應取消請求
    • 用非零 execute 引數呼叫 thread_cleanup_pop 時
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <pthread.h>
 4 
 5 /** 定義執行緒清理函式 */
 6 void clean_fun(void *arg)
 7 {
 8     char *s = (char *)arg;
 9     printf("clean_fun: %s\n", s);
10 }
11 
12 void *th_fun(void
*arg) 13 { 14 int execute = (int )arg; 15 16 pthread_cleanup_push(clean_fun, "first clean func"); 17 pthread_cleanup_push(clean_fun, "second clean func"); 18 printf("thread running %lx\n", pthread_self()); 19 20 pthread_cleanup_pop(execute); 21 pthread_cleanup_pop(execute);
22 return (void *)0; 23 } 24 25 int main(void) 26 { 27 int err; 28 pthread_t th1, th2; 29 30 if((err = pthread_create(&th1, NULL, th_fun, (void *)1)) != 0) { 31 perror("pthread create error"); 32 } 33 34 pthread_join(th1, NULL); 35 printf("th1(%lx) finished\n", th1); 36 37 38 if((err = pthread_create(&th2, NULL, th_fun, (void *)1)) != 0) { 39 perror("pthread create error"); 40 } 41 42 pthread_join(th2, NULL); 43 printf("th2(%lx) finished\n", th2); 44 45 return 0; 46 }

  執行如下:

  

  執行緒結束,會觸發呼叫最終的 clean 函式,呼叫的時候會根據 pop 裡面的入棧順序,先入後出進行呼叫。

37.2 程序和執行緒啟動方式比較

  

37.3 執行緒的狀態轉換