1. 程式人生 > >Linux--多執行緒之執行緒的取消pthread_cancel

Linux--多執行緒之執行緒的取消pthread_cancel

#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
}