SylixOS中pthread_cancel函數淺析1.1 概述
取消一個線程要確保該線程能夠釋放其所持有的任何鎖、分配的內存,使整個系統保持一致性。在很多復雜情況下要保證這種正確性是有一定困難的。
一種簡單的線程取消:取消線程調用一個取消線程的函數,被取消線程死亡。在這種情況下,被取消線程所持有的的資源得不到釋放。取消線程負責保證被取消者處于可安全取消狀態,在一個要求可靠性高的系統中,這種保證非常困難或者無法實現。這種取消稱為不受限制的異步取消。
還存在另外一種更安全的線程取消機制。一個線程可以以可靠的受控制的方式向進程的其他線程發出取消請求,目標線程可以掛起這一請求使實際的取消動作在此后安全的時候進行,稱為延遲取消。目標線程還可以定義其被取消后自動被系統調用的線程清除函數。
SylixOS兼容絕大多數POSIX接口, SylixOS中pthread_cancel函數執行線程取消功能。
pthread_cancel 函數和目標線程的取消動作是異步的。根據目標線程的取消屬性不同,取消請求可能被忽略、立即執行或者延遲處理。為了清楚這些動作,下面知識點先簡單介紹線程取消屬性相關概念。
1.2 知識點
SylixOS中pthread_cancel函數由px_pthread.h頭文件定義,其原型為:
int pthread_cancel (pthread_tthread);
此函數成功返回 0,失敗返回錯誤號;
參數 thread 是取消的線程句柄。
SylixOS中用取消狀態,取消類型和取消請求這3個元素共同表示一個線程的取消屬性,其存在于線程控制塊中。如表2-1所示。
表 2-1 取消說明
表示說明
取消類型允許取消
LW_THREAD_CANCEL_ENABLE線程取消狀態決定了指定線程是否可以被取消,取消狀態分為允許取消和禁止取消,一個線程設置為允許取消意味著此線程可以被取消,禁止取消意味著此線程只能從自己返回或者調用 pthread_exit函數來退出。
禁止取消
LW_THREAD_CANCEL_DISABLE
取消類型異步取消
LW_THREAD_CANCEL_ASYNCHRONOUS取消類型是線程取消的方式,分為異步取消和延遲取消,異步取消屬性的線程會在收到取消信號時立即刪除自身,也可說成立即取消,延遲取消屬性的線程會在“安全”的時機調用線程刪除函數刪除自身。
延遲取消
LW_THREAD_CANCEL_DEFERRED
取消請求在延遲取消類型中,取消請求為1表示取消請求被掛起,直到運行到下一個取消點才被執行該取消請求僅在線程允許取消時可用
線程初始化時會有默認的取消屬性,即線程保留允許取消和延遲取消的屬性,保證收到取消信號時,線程接受該取消信號,不會屏蔽掉,并且會在自身安全的時候,調用線程刪除函數,即延遲取消。另外一個線程的取消狀態和取消類型可分別調用相關函數設置,如表 2-2所示。函數均在px_pthread.h頭文件中定義。
表 2-2 設置取消屬性
函數設置線程取消狀態
int
pthread_setcancelstate
(int newstate, int *poldstate)設置線程取消類型
int
pthread_setcanceltype
(int newtype, int *poldtype)
參數參數 newstate 是新狀態
輸出參數 poldstate 返回之前的狀態參數 newtype 是新類型
輸出參數 poldtype 返回之前的類型
返回值此函數成功返回 0,失敗返回錯誤號此函數成功返回 0,失敗返回非 0 值
前文提到,延遲請求會使線程的取消動作在安全的時候進行,那線程具體的取消時機是在什么時候呢?會涉及到“取消點”的概念,在后續章節中介紹。
2 技術實現
2.1 實現流程
SylixOS中pthread_cancel函數實現機制,如圖3-1所示

圖3-1 pthread_cancel函數實現流程
2.2 “取消點”概念
在使用延遲取消機制時,一個線程在可以被取消的地方定義取消點,當收到取消請求時,被取消的線程執行到取消點時退出,或者在一個取消點調用被阻塞時退出。
由于在延遲取消中必須在取消點才能被取消,這一限制可能使取消請求被掛起任意長時間。因此,如果某個調用可能使線程被阻塞或者進入某個較長時間的過程, POSIX 要求這些調用屬于一個取消點,或者稱這些調用為取消點調用,以防止取消請求陷入長時間等待,SylixOS中存在一些擁有取消點的函數,如open,read,pthread_join,printf等,他們都直接或間接的調用了pthread_testcancel函數pthread_testcancel函數內部實現流程如圖 3-2所示。

圖 3-2 pthread_testcancel函數實現流程
因此,被取消線程會在執行擁有取消點的函數時,進入到pthread_testcancel函數內部,進行如圖 32所示的允許取消、延遲取消以及取消請求標志的判斷流程,倘若條件滿足,被取消線程會在這里調用線程刪除函數刪除自身。
看文倉www.kanwencang.com網友整理上傳,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/bangong/20170209/99833.html
文章列表