1. 程式人生 > >zthread學習 例項九 任務終止(二)——中斷方式

zthread學習 例項九 任務終止(二)——中斷方式

引起執行緒變為阻塞狀態的原因有:

1、呼叫了sleep(),執行緒進入休眠狀態。

2、呼叫了wait(),掛起了執行緒的執行。

3、執行緒正在等待某個I/0操作完成(此時中斷是不會出現的)。

4、執行緒在嘗試進入一段被一個互斥鎖保護的程式碼塊,而那個互斥鎖已經被其他執行緒獲得。

終止一個阻塞執行緒和終止一個非阻塞執行緒的方式有很大的不同。

終止一個阻塞執行緒 通常 的做法是,首先喚醒它,然後按終止一個非阻塞執行緒的方式來終止,但這樣執行緒會多執行了一些程式碼。

有時需要在某個執行緒處於阻塞狀態時 立即 終止它。ZThread庫使用拋異常的方式來解決立即終止 阻塞 執行緒。因為從被阻塞的任務中離開時,可能需要銷燬與之相關的物件並清理有關資源,正因為這樣在run()中間跳出更像是丟擲一個異常。在run()函式包含try模組,在響應異常的catch語句中清理有關資源。

interrupt()函式用來給執行緒設定中斷狀態,一個使用了中斷狀態設定的執行緒,如果已經被阻塞或嘗試進行阻塞時將會丟擲一個Interrupted_Exception異常。當異常被丟擲或呼叫了intertupted()時,中斷狀態重新被設定。

中斷狀態可以通過呼叫interrupt()進行設定。呼叫interrupted()來檢查中斷狀態(不僅能告知interrupt()是否被呼叫,還會清除當前的中斷狀態,以確保不會兩次通知正被中斷的任務),interrupted()會用一個Interrupted_Exception異常來通知一個已經阻塞的執行緒,或用一個成功的返回值來通知一個非阻塞的執行緒

。下面例子顯示了當設定中斷狀態時,run()函式中處理阻塞和非阻塞兩種可能性的情況:

 

為了保證不因退出而出現不一致的狀態,所有資源獲取都應封裝在基於的物件中,以便無論run()如何退出,物件的析構都會被呼叫。