#include <pthread.h> int pthread_cancel(pthread_t thread);
一個線程能夠經過此機制向另一個線程發送結束請求,值得一提的是,接收此請求的線程能夠經過本線程的兩個屬性來決定是否取消以及時同步(延時)取消仍是異步(當即)取消。異步
函數成功返回,並不表明那線程就結束了。函數
下面看那兩個屬性設置:spa
#include <pthread.h> int pthread_setcancelstate(int state, int *oldstate); int pthread_setcanceltype(int type, int *oldtype); Compile and link with -pthread.
state和type的值及其意義以下:線程
PTHREAD_CANCEL_ENABLE:翻譯
代表此線程是可取消的,也就是說,在接收一個取消請求到來以後,它註定是要取消的,只不過它有兩種取消方式,一種是同步取消,另一種是異步取消,下面會詳說的。code
PTHREAD_CANCEL_DISABLE:orm
代表此線程是不可取消的,那麼接收取消請求以後,它依然自個人執行。ip
PTHREAD_CANCEL_DEFERRED:代表在線程是可取消的狀況下,它是同步(延時)取消的。所謂同步取消的意思就是說,在收到一個取消請求以後,它會繼續執行下去,直到找到下一個取消點進行退出。ci
那麼什麼是取消點呢?:文檔
取消點是在程序在運行的時候檢測是否收到取消請求,是否容許容許操做執行的點。下面的POSIX線程函數就是取消點:
pthread_join()
pthread_cond_wait()
pthread_cond_timedwait()
pthread_testcancel()
sem_wait()
sigwait()
還有不少,能夠參考man 7 threads
#include <pthread.h> void pthread_testcancel(void); Compile and link with -pthread.
此函數是建立一個取消點。
PTHREAD_CANCEL_ASYNCHRONOUS:
代表是異步取消方式,也就是說線程在收到取消請求以後,當即取消退出。
在默認的狀況下,一個線程是可取消的而且是同步取消的。
這裏,咱們要考慮到一個線程退出後它後續處理的問題,好比說,若是一個線程正執行到一個鎖內時,已經得到鎖了,這時,它由於異常退出了,那麼此時就是一個死鎖的問題。這時咱們可以使用下面的兩個函數:
#include <pthread.h> void pthread_cleanup_push(void (*routine)(void *), void *arg); void pthread_cleanup_pop(int execute);
這是man文檔上描述的,比別人中文翻譯好多了:
These functions manipulate the calling thread's stack of thread-cancellation clean-up handlers.
A clean-up handler is a function that is automatically executed when a thread is canceled (or in
various other circumstances described below); it might, for example, unlock a mutex so that it
becomes available to other threads in the process.
就是說在一個線程結束的時候,會自動執行一個clean-up函數柄,這個函數柄裏有一個stack(棧),咱們以前就經過pthread_cleanup_push往這個棧裏壓入了一個函數,咱們壓入不少個,而後退出的時候,clean-up函數柄會自動的從這些棧裏拿出函數進行執行。
若是此函數沒有異常退出,那這些棧的函數怎麼辦呢?咱們能夠經過phread_cleanup_pop彈出這些棧裏的函數,注意,此時的參數要爲0,若是非0的話,彈出的同時也會執行這些函數的。
那以前講到的死鎖問題咱們能夠這樣解決:
pthread_cleanup_push(pthread_mutex_unlock, (void *) &mutex); pthread_mutex_lock(&mutex); /* do some work */ pthread_mutex_unlock(&mutex); pthread_cleanup_pop(0);