스 레 드 취소 / 취소 (cancel) 【]

스 레 드 취소 / 취소 (cancel)
http://hi.baidu.com/cuyxquuwsxbalqq/item/bd7019182372f1fa9d778a72
스 레 드 취소 정의
일반적인 상황 에서 스 레 드 는 주체 함수 가 종료 할 때 자동 으로 종료 되 지만 다른 스 레 드 에서 보 내 온 종료 (취소) 요청 을 받 아 강제 종료 할 수도 있 습 니 다.
------------------------------------------------------------------------------------------------------------------------------------------------------
2. 스 레 드 취소 의 의미
1. 스 레 드 취소 방법 은 대상 스 레 드 에 Cancel 신 호 를 보 내 는 것 입 니 다. 그러나 Cancel 신 호 를 어떻게 처리 하 는 지 는 대상 스 레 드 가 스스로 결정 하거나 무시 하거나 (취소 금지 시) 즉시 종료 하거나 (취소 점 이나 비동기 모드 에서) Cancelation - point (취소 점, 아래 설명) 로 계속 실행 합 니 다. 한 마디 로 다른 Cancelation 상태 에서 결정 합 니 다.
2. 스 레 드 가 CANCEL 신 호 를 받 은 결 성 처리 (즉 pthread create () 가 스 레 드 를 만 드 는 결 성 상태) 는 취소 점 에서 재 처리 (종료) 하거나 비동기 방식 으로 직접 종료 합 니 다.하나의 스 레 드 처리 cancel 요청 의 종료 작업 은 pthread 에 해당 합 니 다.exit(PTHREAD_CANCELED)。물론 스 레 드 는 PTHREAD 로 설정 할 수 있 습 니 다.CANCEL_DISABLE 이 cancel 요청 처 리 를 거부 합 니 다. 잠시 후에 언급 하 겠 습 니 다.
3. 스 레 드 의 취 소 는 스 레 드 의 작업 방식 (joinable 또는 detached) 과 무관 합 니 다.
-----------------------------------------------------------------------------------------------------------------------------
스 레 드 취소 점
POSIX 표준 에 따라 pthreadjoin()、pthread_testcancel()、pthread_cond_wait()、 pthread_cond_timedwait()、sem_wait (), sigwait () 등 함수 와 read (), write () 등 차단 을 일 으 킬 수 있 는 시스템 호출 은 모두 Cancelation - point 이 며, 다른 pthread 함수 들 은 Cancelation 동작 을 일 으 키 지 않 습 니 다.
하지만 pthreadcancel 의 매 뉴 얼 페이지 에 따 르 면 Linux Thread 라 이브 러 리 와 C 라 이브 러 리 가 잘 결합 되 지 않 았 기 때문에 현재 C 라 이브 러 리 함수 (예 를 들 어 read () 는 Liux 종 에서 모두 Cancelation - point 가 아 닙 니 다.그러나 CANCEL 신 호 는 스 레 드 를 막 힌 시스템 호출 에서 종료 시 키 고 EINTR 오류 코드 를 설치 하기 때문에 Cancelation - point 가 필요 한 시스템 호출 전후 pthread 를 호출 할 수 있 습 니 다.testaccel () 은 POSIX 표준 이 요구 하 는 목 표를 달성 합 니 다. 즉, 다음 코드 세그먼트 입 니 다.              pthread_testcancel();
              retcode = read(fd, buffer, length);
              pthread_testcancel();

 
-----------------------------------------------------------------------------------------------------------------------------
4. 프로 그래 밍 방면 의 고려
1. 스 레 드 가 무한 순환 에 있 고 체 내 에서 취소 점 까지 실행 되 는 필연 적 인 경로 가 없 으 면 스 레 드 는 외부 다른 스 레 드 의 취소 요청 으로 종 료 될 수 없습니다.따라서 이러한 순환 체 의 필수 경로 에 pthread 를 추가 해 야 합 니 다.testaccel () 호출.
2. pthreadcancel () 이 돌 아 왔 을 때 스 레 드 가 취소 되 지 않 았 습 니 다. 대상 스 레 드 에 만 요청 을 보 낼 수 있 습 니 다. 대상 스 레 드 는 현재 취소 점 에 도착 하지 않 았 습 니 다. 스 레 드 가 언제 중단 되 는 지 알 고 싶 으 면 취소 한 후에 pthread 를 호출 해 야 합 니 다.join()。하나의 예 외 는 스 레 드 가 detach 에 의 해 처 리 된 후에 이렇게 처리 할 수 없습니다.           a) join 이 detached 된 스 레 드 일 때 EINVAL 로 돌아 갑 니 다.           b) join 후 이 스 레 드 가 detached 로 설정 되면 detach 가 작 동 하지 않 습 니 다.따라서 하나의 스 레 드 가 분리 방식 으로 실 행 될 수 있다 는 것 을 알 면 pthread 에 있 을 필요 가 없습니다.cancel () 후 pthread 호출join()。
-----------------------------------------------------------------------------------------------------------------------------
5. 스 레 드 취소 와 관련 된 pthread 함수
int pthread_cancel(pthread_t thread)  thread 스 레 드 에 종료 신 호 를 보 내 고 성공 하면 0 으로 돌아 갑 니 다. 그렇지 않 으 면 0 값 이 아 닙 니 다.발송 에 성공 했다 고 해서 thread 가 종료 되 는 것 은 아 닙 니 다.
int pthread_setcancelstate(int state, int *oldstate)  이 스 레 드 가 Cancel 신호 에 대한 반응 을 설정 합 니 다. state 는 두 가지 값 이 있 습 니 다: PTHREADCANCEL_ENABLE (결 성) 와 PTHREADCANCEL_DISABLE 은 신 호 를 받 은 후 CANCLED 상태 로 설정 하고 CANCEL 신 호 를 무시 하고 계속 운행 하 는 것 을 나타 낸다.old_state 가 NULL 이 아니라면 원래 의 Cancel 상태 로 저장 합 니 다.
int pthread_setcanceltype(int type, int *oldtype)  이 스 레 드 에서 동작 을 취소 할 시 기 를 설정 합 니 다. type 은 두 가지 로 값 을 추출 합 니 다: PTHREADCANCEL_DEFFERED 와 PTHREADCANCEL_ASYCHRONUS 는 Cancel 상태 가 Enable 일 때 만 유효 합 니 다. 각각 신 호 를 받 은 후에 다음 취소 점 까지 계속 실행 하고 종료 하 며 취소 동작 을 즉시 실행 합 니 다 (종료).oldtype 이 NULL 이 아니라면 실 어 온 취소 동작 형식 값 을 저장 합 니 다.
void pthread_testcancel(void)  이 스 레 드 가 Canceld 상태 에 있 는 지 확인 하고 취소 동작 을 하지 않 으 면 바로 돌아 갑 니 다.

좋은 웹페이지 즐겨찾기