1 執行緒的取消 強制使程序退出

2021-09-05 13:03:37 字數 3038 閱讀 1553

不建議使用取消介面來使執行緒退出

①向執行緒傳送取消請求

pthread_cancel(pthread_t thread);    

1.乙個執行緒可以通過呼叫該函式向另乙個執行緒傳送取消請求。

2.如果成功,該函式返回0,否則將錯誤碼返回。

3.這不是個阻塞型介面,發出請求後,函式就立刻返回了,而不會等待目標執行緒退出之後才返回。

4.函式的本質:會向目標執行緒傳送乙個sigcancel(可靠訊號)的訊號,該訊號就是6.4節「 訊號的分類 」中提到的被nptl徵用的32號訊號。

int pthread_setcancelstate(int state, int *oldstate);

·pthread_cancel_enable 

執行緒的預設取消狀態是 pthread_cancel_enable 

·pthread_cancel_disable

1.其他執行緒傳送的sigcancel訊號被暫時掛起(而不是被拋棄),暫時不予處理。當執行緒狀態設定為pthread_cancel_enable後, sigcancel訊號不在被掛起, 會加入到正常的訊號佇列中。

2.那麼收到取消請求後,會發生什麼?這取決於執行緒的取消型別。    

③設定執行緒的取消型別

int pthread_setcanceltype(int type, int *oldtype);

·pthread_cancel_asynchronous(非同步取消)    // 永遠不要使用非同步取消

即執行緒可能在任何時間點(可能是立即取消,但也不一定)取消執行緒。這種取消方式太粗暴,很容易造成後續的混亂。

·pthread_cancel_deferred(延遲取消)

1.新建執行緒的預設取消型別為"延遲取消"。

2.取消點: 就是對於某些函式,如果執行緒允許取消且取消型別是延遲取消,並且執行緒也收到了取消請求,

那麼當執行到這些函式的時候,執行緒就可以退出了。==>這些函式稱為"取消點"函式

3.通過man pthreads可以查詢到這些取消點函式(有好幾十個之多)。    

4.執行緒執行到取消點,會自動處理取消請求,但是如果執行緒沒有用到任何取消點函式。

1.為了應對這種場景,系統引入了pthread_testcancel函式,該函式一定是取消點。

2.程式設計者可以周期性地呼叫該函式,只要有取消請求,執行緒就能響應。

void pthread_testcancel(void);

5.如果執行緒被取消,並且其分離狀態是可連線的,那麼需要由其他執行緒對其進行連線(**資源)。

6. pthread_join 函式的第二個引數會被置成 pthread_canceled ,通過該值可以知道執行緒並不是「壽終正寢」,而是被其他執行緒取消而導致的退出。

④執行緒取消的弊端⑤非同步取消安全函式    //即使執行非同步取消也安然無恙的函式

pthread_cancel()

pthread_setcancelstate()

pthread_setcanceltype()

⑥程式設計人員應該遵循以下原則:

第一,輕易不要呼叫 pthread_cancel 函式,在外部殺死執行緒是很糟糕的做法,畢竟如果想通知目標執行緒退出,還可以採取其他方法。

第二,如果不得不允許執行緒取消,那麼在某些非常關鍵不容有失的**區域,暫時將執行緒設定成不可取消狀態,退出關鍵區域之後,再恢復成可以取消的狀態。

第三,在非關鍵的區域,也要將執行緒設定成延遲取消,永遠不要設定成非同步取消。    

⑦示例**

#include #include #include #include #include #include #include #include #include #include #include #include #include #include static int cancel_point = 0;

void *runtime1(void *arg)

void *runtime2(void *arg)

void *runtime3(void *arg)

void *runtime4(void *arg)

int main(int argc, char **argv)

/* 執行結果:

book@gui_hua_shu:$ gcc pthread_cancel.c -pthread

book@gui_hua_shu:$ ./a.out

------------------------1-pthread cancel test--------------------------------

runtime1: before

runtime1 canceled, it's not a normal exit

------------------------2-pthread cannot cancel test--------------------------------

runtime2: before

runtime2: after

runtime2 normal exit

------------------------3-pthread cancel type test--------------------------------

pthread ptid3 cancel when across cancel_point

runtime3 canceled, it's not a normal exit

------------------------4- write security code --------------------------------

this is the key code

runtime4 canceled, it's not a normal exit

book@gui_hua_shu:/work/nfs_root/qt_fs_new/2system_pro/pthread$

*/

posix執行緒 執行緒的取消

初看這個主題時,覺得實在簡單。在我印象中,執行緒取消的實現通常是宣告乙個全域性變數來代表取消標誌,乙個執行緒在最開始的大while中判斷該標誌是否被設定,如果被設定就跳出迴圈。但是這有乙個問題是,如果程式中有n個執行緒都有可能被取消,那麼我們是否要宣告n個全域性變數來單獨控制它們的取消?posix提...

Linux pthread 執行緒的取消

執行緒的取消 即 執行緒的終止 某個執行緒,可以要求指定的執行緒終止!方法 1.傳送取消請求 pthread cancel 原型 int pthread cancel pthread t thread 注意 指定的執行緒接收到這個 請求 後,不一定馬上就終止。取決於 被取消執行緒 的 取消請求 的使...

ajax強制取消快取的方法

1 加個隨機數 2 在要非同步獲取的asp頁面中寫一段禁止快取的 response.buffer true response.expiresabsolute now 1 response.expires 0 response.cachecontrol no cache 3 在ajax傳送請求前加上x...