Single thread 로 작성된 프로그램을 찾기가 대단히 어려워 졌다. NM 을 포함한 DTV Application 은 대부분 Posix 쓰레드 함수를 사용한다.
이들 함수에 대해 알고 있다면, 프로그램을 좀 더 이해하기 쉽고, 코드 작성 및 수정이 용이할 것이다. 여기서는 NM 에서 사용한 함수들을 위주로 설명할 것이다.
pthread_setcancelstate
int pthread_setcancelstate(int state, int *oldstate);
실행을 방해받지 않고 완료해야만 하는 코드 영역에서 취소를 비활성화 시킬 수 있다. 예를 들어 데이터베이스 업데이트 명령을 완료하기 위해서 write 함수를 두번 호출해야 한다고 가정해보자.
이때 첫번째 호출만이 완료된 상태로 두 번째 호출이 취소되기를 원하지는 않을 것이다. 만일 쓰레드에서 취소를 비활성화시켜 놓았을 때 취소가 요청된다면, 쓰레드는 요청이 받았다는 사실만을 기억해 둘 뿐, 나중에 취소가 활성화될 때까지 이 요청에 대해 아무런 일도 수행하지 않는다.
state, oldstate | |
PTHREAD_CANCEL_ENABLE | 취소를 활성화한다 |
PTHREAD_CANCEL_DISABLE | 취소를 비활성화한다 |
이 함수를 호출한 쓰레디의 취소 상태를 변경하기 위해서 사용된다. 취소상태는 PTHREAD_CANCEL_ENABLE, PTHREAD_CANCEL_DISABLE둘중 하나가 지정될 수 있다. 전자는 취소 상태를 활성화 시키기 위해서 후자는 취소 상태를 비활성화 시키기 위해서 사용한다. 취소상태는 state를 통해서 설정된다. 이전의 취소상태는 oldstate를 통해서 받아올 수 있다. NULL일 경우 받아오지 않게 된다.
pthread_setcanceltype
취소 요청을 받은 쓰레드가 어떻게 반응 할건지(취소타입)를 결정하기 위해서 사용된다. 반응의 종류는 type를 통해서 설정할수 있다. PTHREAD_CANCEL_ASYNCHRONOUS와 PTHREAD_CANCEL_DEFERRED 둘 중 하나를 선택할 수 있다. 전자일 경우 바로 종료하며, 후자의 경우 취소지점을 벗어날 때까지 기다리게 된다. oldtype를 이용해서 이전 취소타입을 얻어 올 수 있다. NULL이라면 받아오지 않는다. 이 함수는 당연하지만 취소상태가 PTHREAD_CANCEL_DISABLE 라면 의미 없는 함수다.