pthread에서 쓰레드로 클래스 객체를 이용하는 방법과 프로세스 종료시 메인 쓰레드에서 생성된 자식쓰레드에게서 어떤 일이 일어나는지 어떻게 하면 좀더 깔끔하게 종료할 수 있을지에 대한 고민?을 담고 있다. 함께 고민해 보자.
목 적 #
C++ 에서 자바의 그것과 비슷한 쓰레드 객체를 만들어 사용한다
객체지향개념에서 각 쓰레드란건 프로그램에서 가장 큰 객체덩어리로 볼 수 있으며, 그런 관점에서 하나의 클래스의 인스턴스 자체로 쓰레드가 된다면 개념적으로 좋을것이다
클래스의 인스턴스를 생성하는순간 클래스의 멤버변수와 메소드를 가지고 활동하는 쓰레드가 가동된다
덧붙여, 데몬 프로그램에서 stop, restart 시에 보통 발생시키는 SIGTERM 신호를 받아서 각 자식 쓰레드들을 종료시킨 후 쓰레드 객체의 소멸자를 호출되게 하여 동적으로 생성한 메모리 및 각종 정리해야할 핸들러들을 해제시킨다
Code 1 #
/* 자바의 그것과 비슷한 쓰레드 객체 클래스 또는 인터페이스 구현 */
/* 데몬으로 실행시 stop 에 의한 SIGTERM 신호에 쓰레드객체의 소멸자 호출처리 */
실행을 시켜보면 main 종료시에 객체(변수를 포함한 모든 인스턴스들)의 해제가 먼저 일어나고 - 소멸자가 실행되는 동안 객체 쓰레드가 계속 실행되고 있음 - 그 다음 각 쓰레드을 종료하고 main이 종료되는것을 알 수 있다. 이것은 보통 아무 문제도 되지 않는다. 소멸자가 실행되고 쓰레드가 종료되는건 아주 빠른 순간에 일어날것이다. 그러나, 이미 해제된 메모리나 핸들러에 어떤 엑세스가 가해질 확률이 존재한다는것은 결코 깔끔하지 못하다(적어도 나는 찝찝하다). 그리하여, 보통 데몬의 stop 스크립트에서 발생시키는 SIGTERM을 처리하는 핸들러를 두어 수동으로 먼저 쓰레드를 종료시킨 후 소멸자가 호출되게 해보자.
Code 2 #
/* 자바의 그것과 비슷한 쓰레드 객체 클래스 또는 인터페이스 구현 */
/* 데몬으로 실행시 stop 에 의한 SIGTERM 신호에 쓰레드객체의 소멸자 호출처리 */
ps 하여 나오는 프로세스중에 이 프로그램명의 최상위 pid를 kill 해보자 (kill pid 혹은 kill -TERM pid)
자식 쓰레드를 먼저 종료시킨 후 소멸자가 호출되는것을 알 수 있다
미비점 #
신호처리기에서 쓰레드객체에 접근하기 위하여 쓰레드객체의 인스턴스를 전역으로 선언하였다. 이러한것은 객체지향개념에서는 좋지 못하다. 가능한한 전역변수는 쓰지 않는것이 좋다. 허나 전통적인 시그널은 데이터를 전달할 수 가 없다. 때문에 RTS 를 사용하여 이를 해결할 수 있을것이다. 혹은, 데몬종료시의 메모리와 쓰레드 정리를 위한 더 좋은 방법이 있으면 알려달라 (정리안해도 된다는 말은 하지말아달라. 나도 안다. -.-; 그러나 하는게 좋지 않겠는가?)
출처 : http://www.joinc.co.kr/modules.php?name ··· 3Dnested
목 적 #
C++ 에서 자바의 그것과 비슷한 쓰레드 객체를 만들어 사용한다
객체지향개념에서 각 쓰레드란건 프로그램에서 가장 큰 객체덩어리로 볼 수 있으며, 그런 관점에서 하나의 클래스의 인스턴스 자체로 쓰레드가 된다면 개념적으로 좋을것이다
클래스의 인스턴스를 생성하는순간 클래스의 멤버변수와 메소드를 가지고 활동하는 쓰레드가 가동된다
덧붙여, 데몬 프로그램에서 stop, restart 시에 보통 발생시키는 SIGTERM 신호를 받아서 각 자식 쓰레드들을 종료시킨 후 쓰레드 객체의 소멸자를 호출되게 하여 동적으로 생성한 메모리 및 각종 정리해야할 핸들러들을 해제시킨다
Code 1 #
/* 자바의 그것과 비슷한 쓰레드 객체 클래스 또는 인터페이스 구현 */
/* 데몬으로 실행시 stop 에 의한 SIGTERM 신호에 쓰레드객체의 소멸자 호출처리 */
실행을 시켜보면 main 종료시에 객체(변수를 포함한 모든 인스턴스들)의 해제가 먼저 일어나고 - 소멸자가 실행되는 동안 객체 쓰레드가 계속 실행되고 있음 - 그 다음 각 쓰레드을 종료하고 main이 종료되는것을 알 수 있다. 이것은 보통 아무 문제도 되지 않는다. 소멸자가 실행되고 쓰레드가 종료되는건 아주 빠른 순간에 일어날것이다. 그러나, 이미 해제된 메모리나 핸들러에 어떤 엑세스가 가해질 확률이 존재한다는것은 결코 깔끔하지 못하다(적어도 나는 찝찝하다). 그리하여, 보통 데몬의 stop 스크립트에서 발생시키는 SIGTERM을 처리하는 핸들러를 두어 수동으로 먼저 쓰레드를 종료시킨 후 소멸자가 호출되게 해보자.
Code 2 #
/* 자바의 그것과 비슷한 쓰레드 객체 클래스 또는 인터페이스 구현 */
/* 데몬으로 실행시 stop 에 의한 SIGTERM 신호에 쓰레드객체의 소멸자 호출처리 */
ps 하여 나오는 프로세스중에 이 프로그램명의 최상위 pid를 kill 해보자 (kill pid 혹은 kill -TERM pid)
자식 쓰레드를 먼저 종료시킨 후 소멸자가 호출되는것을 알 수 있다
미비점 #
신호처리기에서 쓰레드객체에 접근하기 위하여 쓰레드객체의 인스턴스를 전역으로 선언하였다. 이러한것은 객체지향개념에서는 좋지 못하다. 가능한한 전역변수는 쓰지 않는것이 좋다. 허나 전통적인 시그널은 데이터를 전달할 수 가 없다. 때문에 RTS 를 사용하여 이를 해결할 수 있을것이다. 혹은, 데몬종료시의 메모리와 쓰레드 정리를 위한 더 좋은 방법이 있으면 알려달라 (정리안해도 된다는 말은 하지말아달라. 나도 안다. -.-; 그러나 하는게 좋지 않겠는가?)
출처 : http://www.joinc.co.kr/modules.php?name ··· 3Dnested
"UNIX/Linux C" 카테고리의 다른 글
- Zlib를 이용한 압축 프로그래밍 (0)2007/05/11
- proc파일시스템 프로그래밍 (0)2007/05/11
- 쓰레드 객체의 사용 (0)2007/05/11
- 쓰레드 종료 상태 (0)2007/05/11
- Strsafe.h: Safer String Handling in C (0)2007/04/24

수안이의 컴퓨터 연구실



Leave your greetings.