7. 쓰레드 취소
System Program/pthread 2013. 1. 1. 13:541. 정의
쓰레들은 보통 pthread_exit() 함수를 호출하거나 콜백함수에서 리턴함으로써 종료될 때까지
병렬로 작업을 수행한다.
가끔은 특정 쓰레드의 동작을 취소하고 싶은 경우가 있다. 이 때 사용하는 함수이다.
2. 쓰레드 취소 함수
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 |