什麼是執行緒取消?


線上程完成之前終止它被稱為**執行緒取消**。例如,如果多個執行緒併發地搜尋資料庫,而一個執行緒返回結果,則可以取消其餘執行緒。另一種情況可能是使用者按下網頁瀏覽器上的按鈕,阻止網頁進一步載入。網頁載入通常使用多個執行緒——每個影像都在單獨的執行緒中載入。當用戶在瀏覽器上按下停止按鈕時,將取消載入頁面所有執行緒。要取消的執行緒通常稱為目標執行緒。目標執行緒的取消可能發生在兩種不同的情況下:

  • **非同步取消** - 一個執行緒立即終止目標執行緒。

  • **延遲取消** - 目標執行緒定期檢查是否應終止,從而使其有機會以有序的方式自行終止。

取消的困難出現在已向已取消執行緒分配資源或執行緒在更新與其他執行緒共享的資料過程中被取消的情況下。這在非同步取消中尤其麻煩。許多時候,作業系統將從已取消的執行緒中回收系統資源,但不會回收所有資源。因此,非同步取消執行緒可能無法釋放必要的系統範圍資源。相反,對於延遲取消,一個執行緒指示要取消目標執行緒,但只有在目標執行緒檢查標誌以確定是否應取消後才會發生取消。執行緒可以在可以安全取消的點執行此檢查。在 Pthreads 中,使用 pthread_cancel() 函式啟動執行緒取消。目標執行緒的識別符號作為引數傳遞給該函式。以下程式碼演示了建立並隨後取消執行緒:

示例

pthread t tid;
/* create the thread */
pthread create(&tid, 0, worker, NULL);
…
/* cancel the thread */
pthread cancel(tid);

呼叫 pthread_cancel() 僅表示取消目標執行緒的請求;實際取消取決於目標執行緒如何設定以處理請求。Pthreads 支援三種取消模式。每種模式都定義為狀態和型別,如下表所示。它的取消狀態和型別可以使用 API 由執行緒設定。

模式狀態型別
關閉停用-
延遲啟用延遲
非同步啟用非同步

如表所示,Pthreads 允許執行緒停用或啟用取消。顯然,如果停用取消,則無法取消執行緒。但是,取消請求仍然掛起,因此執行緒可以稍後啟用取消並響應請求。預設取消型別是延遲取消。在這裡,只有當執行緒到達取消點時才會發生取消。建立取消點的一種技術是呼叫 pthread_testcancel() 函式。如果發現取消請求正在掛起,則會呼叫稱為清理處理程式的函式。此函式允許釋放執行緒可能已獲取的任何資源,然後才能終止執行緒。以下程式碼演示了執行緒如何使用延遲取消響應取消請求:

while (1){
   /* do some work for a while */
   /* ... */
   /* check if there is a cancellation request */
   pthread testcancel();
}

更新於:2020年1月31日

5K+ 次瀏覽

啟動您的職業生涯

完成課程後獲得認證

開始
廣告
© . All rights reserved.