三十七、Linux 執行緒——執行緒清理和控制函式、程序和執行緒啟動方式比較、執行緒的狀態轉換
阿新 • • 發佈:2019-01-01
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 執行緒的狀態轉換