天天看點

Linux線程之取消(十三)1.線程取消2.參考代碼

Linux線程之取消(十三)

  • 1.線程取消
  • 2.參考代碼

1.線程取消

功能:

殺死(取消)線程。

參數:

thread : 目标線程ID。

傳回值:

成功:0

失敗: 出錯編号。

注意:線程的取消并不是實時的,而又一定的延時。需要等待線程到達某個取消點(檢查點)。 類似于玩遊戲存檔,必須到達指定的場所(存檔點,如:客棧、倉庫、城裡等)才能存儲進度。 殺死線程也不是立刻就能完成,必須要到達取消點。 取消點:是線程檢查是否被取消,并按請求進行動作的一個位置。通常是一些系統調用creat,open,pause,close,read,write… 執行指令man 7 pthreads可以檢視具備這些取消點的系統調用清單。 可粗略認為一個系統調用(進入核心)即為一個取消點。

2.參考代碼

//=============================================================================
// File Name    : thread_cancel.c
// Author       : FengQQ
//
// Description  : 線程取消
// Annotation   : 取消tid指定的線程,成功傳回0,但是取消隻是發送一個請求,
//				  并不意味着等待線程終止,而且發送成功;也不意味着tid一定會終止。
//
// Created by FengQQ. 2020-10-04
//=============================================================================
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

void *pthread_callback(void *arg)
{
	while(1)
	{
		pthread_testcancel();	//設定取消點
	}

	return 0;
}


int main(int argc,char *argv[])
{
	int ret;
	int cval,jval;
	pthread_t ptid;
	
	ret = pthread_create(&ptid,NULL,pthread_callback,NULL);
	if(ret != 0)
	{
		printf("create new pthread failed...\r\n");
		return -1;
	}
	
	sleep(3);
	cval = pthread_cancel(ptid);	
	if(cval != 0)
	{
		printf("pthread cancel failed...\r\n");
	}
	printf("pthread cancel success\r\n");
	
	jval = pthread_join(ptid,NULL);
	if(jval != 0)
	{
		printf("pthread join failed...\r\n");
	}
	printf("pthread join success\r\n");
	
	return 0;
}

           

Linux線程之退出(十二)

連結: link.(https://blog.csdn.net/qq_39721016/article/details/120243072?spm=1001.2014.3001.5502)

繼續閱讀