2005년 6월 15일 수요일

pthread 사용하기

#include <iostream>
#include <pthread.h>
using namespace std;

int counter = 0;

void* goodThProc(void *arg)
{
    for (int k = 0; k < 1000; k++) {
        ++counter;
        fprintf(stdout, "counter : %d\n", counter);
        for (int l = 0; l < 10000; l++) {
            l *= 2;
            l /= 2;
            l += 10;
            l -= 10;
        }
    }

    return NULL;
}

int main()
{
    const int nThread = 2;

    pthread_t goodTh[nThread];
    int ret;

    for(int i = 0; i < nThread; ++i) {

        ret = pthread_create(&(goodTh[i]), NULL, goodThProc, NULL);

        if (ret != 0) {
            fprintf(stderr, "pthread_create[%d] error : %d\n", i, ret);
            return -1;
        }
    }

    for (int i = 0; i < nThread; ++i) {
        void* pRet;
        int joinRet;

        joinRet = pthread_join(goodTh[i], &pRet);

        if (joinRet != 0) {
             fprintf(stderr, "pthread_join[%d] error : %d\n", i, joinRet);
        }
    }

    return 0;
}

$ g++ a.cpp -g -Wall -o a.out -lpthread
---------------------------------------------------------
컴파일시 -lpthread를 주지 않아도 pthread_create만 쓰면 에러가 나지 않는 다.
대신 실행하면 segmentation fault를 낸다. gdb로 분석해도 call stack도 없다.
아무튼 -lpthread 옵션은 반드시 필요하다.

pthread_join을 해주지 않으면 join()처럼 parent가 먼저 죽었을 때, child가 일을 마치지 못하였어도
종료해 버린다.

댓글 없음:

댓글 쓰기