7. 쓰레드 취소

System Program/pthread 2013. 1. 1. 13:54

1. 정의

 

쓰레들은 보통 pthread_exit() 함수를 호출하거나 콜백함수에서 리턴함으로써 종료될 때까지

병렬로 작업을 수행한다.

 

가끔은 특정 쓰레드의 동작을 취소하고 싶은 경우가 있다. 이 때 사용하는 함수이다.

 

2. 쓰레드 취소 함수

 

#include <pthread.h>

 

int pthread_cancel(pthread_t thread);

 

성공하면 '0'을 리턴, 에러가 발생하면 에러 번호(양수)를 리턴한다.  

 

pthread_cancel() 함수는 즉시 리턴한다.

 

3. 취소 상태와 종류 설정 함수

 

pthread_cancel() 함수를 주 쓰레드나 어떤 쓰레드에서 취소하고자 하는 쓰레드 ID를 호출하면

그 쓰레드의 콜백함수는 취소되게 된다. 취소되는 지점은 취소 지점 가능 함수에 의해서 설정되는데

가능한 함수들의 목록은 너무 길어서 생락한다.

 

4. 예제

 

/*
* main.c -- C Test App.
*
* Copyright (C) 2012-2013, 2013 heesoon.kim <chipmaker.tistory.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>

void *threadFunc(void *arg)
{	
	int count = 0;
	printf("new thread started ....\n");
	int retval;
	
#ifdef TEST_PTHREAD_TESTCANCEL
	while(1)
	{
		count++;
		// 임의의 cancle point 지정
		pthread_testcancel();
	};
#else

#ifdef TEST_PTHREAD_SETCANCELSTATE
	retval = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
	if(retval != 0)
	{
		perror("pthread_create : ");
		exit(EXIT_FAILURE);
	}
	
	retval = pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
	if(retval != 0)
	{
		perror("pthread_create : ");
		exit(EXIT_FAILURE);
	}	
#endif
	
	while(1)
	{
		printf("count = %d \n", count++);
		sleep(1);
		
		// for testing pthread_exit() return value
		if(count == 10)
			break;
	}
#endif

	pthread_exit((void *) count);	
}

int main(int argc, char *argv[])
{
	pthread_t tid;
	int retval;
	void *res;
	
	retval = pthread_create(&tid, NULL, threadFunc, NULL);
	if(retval != 0)
	{
		perror("pthread_create : ");
		exit(EXIT_FAILURE);
	}
	
	sleep(5);
	
#ifndef EXIT_NORMAL	
	retval = pthread_cancel(tid);
	if(retval != 0)
	{
		perror("pthread_cancle : ");
		exit(EXIT_FAILURE);
	}	
#endif
	
	retval = pthread_join(tid, &res);
	if(retval != 0)
	{
		perror("pthread_join : ");
		exit(EXIT_FAILURE);
	}	
	
	if(res == PTHREAD_CANCELED)
	{
		printf("thread cancled\n");
	}
	else
	{
		printf("thread is normal exit retval = %ld \n", (long)res);
	}
	
	exit(EXIT_SUCCESS);
}


 

위의 예제에서 pthread_testcancel() 함수가 있는데, 이 함수는 pthread_cancel() 함수를 주 쓰레드에서 호출 후에

쓰레드가 취소될 수 있는 함수는 정해져 있다 (printf나 sleep 함수는 취소지점으로 가능한 함수이다).

만약 이런 취소 지점으로 가능한 함수가 존재하지 않을 경우, pthread_testcancel() 함수를 주기적으로 호출함으로써

쓰레드 취소지점으로 강제 설정하는 것이다.

 

TEST_PTHREAD_SETCANCELSTATE define 전처리 설정으로 묶어 있는 부분은 쓰레스 취소에 대한 설정을 변경할

수 있다. 자세한 내용은 참고 서적이나 사이트 참조바람.

 

'System Program > pthread' 카테고리의 다른 글

2. pthread 생성  (0) 2014.03.07
6. pthread attribute - (2)  (0) 2013.07.12
8. 쓰레드 클린업 핸들러(쓰레드 취소와 연관)  (0) 2013.07.03
5. pthread attributes  (0) 2013.07.02
1. pthread 개요  (0) 2013.05.27
: