[t:/]$ 지식_

클래스 스레드 실험

2009/02/17

클래스 정의하고 객체 생성할 때마다 스레드를 펑펑 만들고 싶을 때 다음과 같이 하면 된다.

지금 목적은 객체에 입력 이벤트 감시 스레드를 어태치 하는 것이다.

class 선언은 다음과 같다.

class IGWindow : public IGWidget
{
public:
    ...
    static void *event_go(void *param);
    ...
}

스레드 함수 선언은 다음과 같다.

void* IGWindow::event_go(void *param)
{
    static int t = 0;
    int i = 0;
    
    while(1) {
        printf("thread! %x, %d, %d, %x, %x, %x, %x--\n", (int)param, i++, t++, (int)event_go, &i, &t);
        sleep(1);    
    }
}

클래스 생성자에서 스레드 생성을 한다.

    pthread_create(&my_thread, NULL, event_go, (void *)(this));

인스턴스 3개를 만들자 결과는 다음과 같이 된다.

thread! 313e8, 2, 6, 407a6468, 41f55e14, 407b5694, 0--
thread! 44d50, 2, 7, 407a6468, 42755e14, 407b5694, 0--
thread! 3cf30, 2, 8, 407a6468, 42f55e14, 407b5694, 0--

thread! 313e8, 3, 9, 407a6468, 41f55e14, 407b5694, 0--
thread! 44d50, 3, 10, 407a6468, 42755e14, 407b5694, 0--
thread! 3cf30, 3, 11, 407a6468, 42f55e14, 407b5694, 0--

thread! 313e8, 4, 12, 407a6468, 41f55e14, 407b5694, 0--
thread! 44d50, 4, 13, 407a6468, 42755e14, 407b5694, 0--
thread! 3cf30, 4, 14, 407a6468, 42f55e14, 407b5694, 0--

맨 앞의 주소는 스레드 함수를 생성한 인스턴스 자신의 주소다. 각각 다르다. 두 번째 값은 지역변수가. 각각 달리 잘 관리한다. 세 번째 증가하는 값은 스레드 함수내 static 정적 변수다. 같이 쓰고 있다. 네 번째 주소는 스레드 함수 자신의 주소다. 모두 같다. 다섯번째 주소는 지역변수 i의 주소다. 각각 잘 관리한다. 여섯번째 주소는 정적변수 t의 주소다. 모두 같이 쓴다.

멤버 변수 가져오도록 함수를 변경해보자. (물론 생성시 인스턴스 자기 주소를 넘긴상태)

void* IGWindow::event_go(void *param)
{
    static int t = 0;
    int i = 0;
    
    IGWindow *pp = (IGWindow *)param;

    while(1) {
        printf("thread! %s--\n", pp->__src.c_str());
        sleep(1);    
    }
 }








[t:/] is not "technology - root". dawnsea, rss