Linux--多執行緒之執行緒的取消pthread_cancel
阿新 • • 發佈:2019-02-17
#include "apue.h" /** pthread_cancel(pthread_t tid) 取消tid指定的執行緒 成功返回0 取消只是傳送一個請求 會不正常的終止執行緒 pthread_setcancelstate(int state,int *oldstate) 設定本執行緒對cancel訊號的反應 state有兩種值 PTHREAD_CANCEL_ENABLE(預設) 和PTHREAD_CANCEL_DISABLE 分別表示收到訊號後設置為 canceled 狀態和忽略cancel訊號繼續執行 oldstate 不為NULL則存入原來的cancel狀態 pthread_setcanceltype(int type,int *oldtype) 設定呼叫執行緒取消動作的執行時機,type可以為 PTHREAD_CANCEL_DEFERRED 和 PTHREAD_CANCEL_ASYCHRONOUS 僅當cancel狀態為enable時 有效 分別表示收到訊號後繼續執行到下一個 取消點然後退出和立即退出 oldtype 如果不為NULL則存入原來的取消動作型別 執行緒的預設狀態為可以處理訊號 並且以PTHREAD_CANCEL_DEFERRED 的策略執行 */ /** 測試執行緒 對執行緒取消訊號的預設處理方式 */ void *thread_fun(void *person1){ //列印 int i=0; for(;i<5;i++) { //執行結果不穩定而且很大的機率 兩次列印相同的i printf("I am lived i=%d\n",i);//取消點 usleep(1); } return (void *)1; } int main(){ pthread_t tid; int err,cval; //建立執行緒 err = pthread_create(&tid,NULL,thread_fun,NULL); if(err!=0){ perror(" fail to create thread "); return -1; } printf("success to create thread tid = %lu \n ",tid); //傳送 取消執行緒的訊息 cval = pthread_cancel(tid); if(cval!=0) { perror("fail to cancel thread"); return -1; } printf(" succeed to send request to cancel thread \n"); //主執行緒退出 pthread_exit(NULL);//always succeeds }