thread cancellation : thread가 작업을 다 완료하기 전에 terminate 하는 것이다.
예를 들어, web browser에서 이미지 로딩 중에 유저가 다른 버튼을 클릭했을 때 이미지 로딩을 담당하는 스레드는 terminate되게 된다.
이런 방식으로 cancel될 스레드를 target thread라고 부르고, 이 스레드를 2가지 방법으로 cancel시킬 수 있다 :
문제가 발생하는 경우가 있는데, canceled thread에게 할당된 자원이 있거나 다른 스레드들과 공유하는 자원을 수정하는 도중에 cancel되는 경우가 있다. 특히 asynchronous하게 cancel되었을 경우 자원이 덜 회수된다던지 하는 문제가 발생한다.
deferred cancellation의 경우 target thread가 스스로 cancel되어야 하는지 체크한 다음에 자신을 cancel시키기 때문에, 할당한 자원을 모두 해제하고 종료시키므로 안전하다.
Pthreads에서는 pthread_cancel()함수가 있다. 예제코드 :
pthread_cancel()은 target thread로 하여금 cancel하도록 요청만 하고, 강제하지는 않는다. 스레드가 cancel되는 방식은 thread가 request를 어떻게 처리할건지 설정된 값에 따라 달라진다. <아래 표 참고>
표를 보면 알 수 있듯, Pthreads는 thread가 cancellation을 disable할지 enable할지 선택하게 한다. disabled라면 cancel되지 않는다. 하지만 request 자체는 남아있기 때문에, 나중에 mode가 바뀐다면 cancel될 수도 있다.
default cancellation type : deferred cancellation
thread가 cancellation point에 도달해야지만 cancellation이 이루어진다.
대부분의 POSIX와 standard C library의 blocking system call들은 cancellation point라고 정의되어 있고, man pthreads를 통해 확인해 볼 수 있다.
직접 cancellation point를 만드는 방법 : pthread_testcancel()함수 사용하기.
pthread_testcancel()함수 : cancellation request가 존재한다면 리턴하지 않고 thread는 종료되고, 존재하지 않는다면 리턴되고 thread는 다음 명령을 실행하게 된다.
Pthreads는 스레드가 canceled 되었을 때 cleanup handler 함수가 호출되도록 할 수 있다.
thread가 terminate 되기 전에 할당해 놓은 자원들을 할당해제해주는 그런 과정이 포함될 수 있음.
이런 과정을 통해서 deferred cancelation을 구현할 수 있다.
앞선 문제점들 때문에 Pthread documentation에서는 asynchronous cancellation을 추천하지 않는다.
Linux system에서, Pthreads API를 이용한 thread cancellation은 signal을 통해 이루어진다.