歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

POSIX線程清理函數

POSIX清理函數的調用時機:

調用pthread_exit()時,會調用清理函數;通過return返回的線程不會調用。

被別的線程取消的時候,會調用。

pthread_cleanup_pop()參數為非零時,會調用。

  1. #include <stdio.h>   
  2. #include <pthread.h>   
  3. #include <windows.h>  // Sleep   
  4.   
  5. pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;  
  6. pthread_cond_t cond = PTHREAD_COND_INITIALIZER;  
  7.   
  8. struct Node  
  9. {  
  10.     int         number;  
  11.     struct Node *next;  
  12. } *head = NULL;  
  13.   
  14. // 清理函數   
  15. void cleanup_handler(void *node)  
  16. {  
  17.     printf("Cleanup handler of second thread.\n");  
  18.     free(node);  
  19.     pthread_mutex_unlock(&mtx);  
  20. }  
  21.   
  22. void* thread_func(void *arg)  
  23. {  
  24.     struct Node *p = NULL;  
  25.     // 清理函數入棧,此demo只需一個清理函數   
  26.     pthread_cleanup_push(cleanup_handler, p);  
  27.   
  28.     while (true)  
  29.     {  
  30.         pthread_mutex_lock(&mtx);  
  31.         if (head == NULL)  
  32.         {  
  33.             pthread_cond_wait(&cond, &mtx);  
  34.         }  
  35.         p = head;  
  36.         head = head->next;  
  37.         printf("Got %d from front of queue\n", p->number);  
  38.         free(p);  
  39.         pthread_mutex_unlock(&mtx);  
  40.     }  
  41.     /* 若從此處終止線程,則屬於正常退出,無需清理。所以,只需將清理函數出棧。故而用 
  42.     參數零。若是從上面的“取消點”退出,則清理函數出棧時被調用:鎖被打開,同時釋放資源。*/  
  43.     pthread_cleanup_pop(0);  
  44.     return 0;  
  45. }  
  46.   
  47. int main(int argc, char* argv[])  
  48. {  
  49.     pthread_t tid;  
  50.     pthread_create(&tid, NULL, thread_func, NULL);  
  51.     for (int i = 0; i < 10; i++)  
  52.     {  
  53.         struct Node* p = (Node *)malloc(sizeof(struct Node));  
  54.         p->number = i;  
  55.   
  56.         // <!-- 對head操作屬於臨界區   
  57.         pthread_mutex_lock(&mtx);  
  58.         p->next = head;  
  59.         head = p;  
  60.         pthread_cond_signal(&cond);  
  61.         pthread_mutex_unlock(&mtx);  
  62.         // 所以要用互斥鎖保護起來--!>   
  63.   
  64.         Sleep(1);  
  65.     }  
  66.     printf("Main thread wants to cancel the 2nd thread.\n");  
  67.   
  68.     /* 關於pthread_cancel,有一點額外的說明,它是從外部終止子線程,子線程會在 
  69.     最近的取消點,退出線程。而在我們的代碼裡,最近的取消點是pthread_cond_wait()了。*/  
  70.     pthread_cancel(tid);  
  71.     pthread_join(tid, NULL);  
  72.     printf("All done -- exiting\n");  
  73.     return 0;  
  74. }  
Copyright © Linux教程網 All Rights Reserved