有兩個線程屬性并沒有包含在pthread_attr_t結構中,它們是可取消狀態和可取消類型。這兩個屬性影響著線程在響應pthread_cancel函數(http://www.CUOXin.com/nufangrensheng/p/3519175.html)調用時所呈現的行為。
可取消狀態屬性可以是PTHREAD_CANCEL_ENABLE,也可以是PTHREAD_CANCEL_DISABLE。線程可以通過調用pthread_setcancelstate修改它的可取消狀態。
#include <pthread.h>int pthread_setcancelstate(int state, int *oldstate);返回值:若成功則返回0,否則返回錯誤編號
pthread_setcancelstate把當前的可取消狀態設置為state,把原來的可取消狀態存放在由oldstate指向的內存單元中,這兩步是原子操作。
pthread_cancel調用并不等待線程終止,在默認情況下,線程在取消請求發出以后還是繼續運行,直到線程到達某個取消點。取消點是線程檢查是否被取消并按照請求進行動作的一個位置。POSIX.1保證在線程調用表12-7中列出的任何函數時,取消點都會出現。
表12-7 POSIX.1定義的取消點
線程啟動時的默認的可取消狀態時PTHREAD_CANCEL_ENABLE。當狀態設為PTHREAD_CANCEL_DISABLE時,對pthread_cancel的調用并不會殺死線程;相反,取消請求對這個線程來說處于未決狀態。當取消狀態再次變為PTHREAD_CANCEL_ENABLE時,線程將在下一個取消點上對所有未決的取消請求進行處理。
除了表12-7中列出的函數,POSIX.1還指定了表12-8中列出的函數作為可選的取消點。
表12-8 POSIX.1定義的可選取消點
如果應用程序在很長一段時間內都不會調用到表12-7或表12-8中的函數,那么可以調用phread_testcancel函數在程序中自己添加取消點。
#include <pthread.h>void pthread_testcancel(void);
調用pthread_testcancel時,如果有某個取消請求正處于未決狀態,而且取消并沒有置為無效,那么線程就會被取消。但是如果取消被置為無效時,pthread_testcancel調用就沒有任何效果。
這里描述的默認取消類型也稱為延遲取消。調用pthread_cancel以后,在線程到達取消點之前,并不會出現真正的取消。可以通過調用pthread_setcanceltype來修改取消類型。
#include <pthread.h>int pthread_setcanceltype(int type, int *oldtype);返回值:若成功則返回0,否則返回錯誤編號
type參數可以是PTHREAD_CANCEL_DEFERRED,也可以是PTHREAD_CANCEL_ASYNCHRONOUS,pthread_setcanceltype函數把取消類型設置為type,把原來的取消類型返回到oldtype指向的整數單元。
異步取消與延遲取消不同,使用異步取消時,線程可以在任意時間取消,而不是非得遇到取消點才能被取消。
本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。
新聞熱點
疑難解答