2011-07-28 4 views
4

C 및 pthread로 프로그래밍 중입니다.pthread_t 인스턴스가 범위를 벗어나게 할 수 있습니까?

void long_running_function(void * arg) { 
    ... 
} 


void start_long_running_function(void * arg) { 
    pthread_t thread; 
    pthread_create(&thread , NULL , long_running_function , arg); 
    /* What about the thread variable? */ 
} 

start_long_running_function을 (떠나) 로컬 변수 '스레드'기능 범위를 벗어난 갈 것이다 : 나는 별도의 스레드에서 실행하려는 장기 실행 기능을 가지고있다. 괜찮습니까? 예를 들어 문제가 발생할 수 있습니다. long_running_function()이 완료되면?

나는 내 코드에 설명 된 접근 방식을 시도해 보았지만 제대로 작동하는 것으로 보인다.하지만 운이 좋을까?

감사 조아킴

답변

4

예 -이 변수가 범위를 벗어나 갈 수 있도록 안전합니다. 그러나 어떤 점에서 두 가지 중 하나를 수행해야한다는 것을 기억하십시오 :

1) pthread_detach() 커널은 이와 관련된 일종의 물건을 비울 것입니다.

2) pthread_join() 부작용으로 분리합니다.

그렇지 않으면 리소스가 누출 될 것입니다.

+0

감사합니다. 감사합니다. pthread_detach()를 살펴 보겠습니다. start_long_running_function() 끝 부분에 추가 할 수 있다고 생각합니다. – user422005

+1

@ user422005 : 항상 분리하려고한다는 것을 알고 있다면, 스레드 생성시 속성 (pthread_attr_setdetachstate)을 사용하여 처음에 분리 된 스레드를 만들 수 있습니다. –

0

이것은 C 구조체 인 Plain Old Data이므로 범위를 벗어나면 부작용을 초래할 소멸자가 없습니다. 범위를 잃는 유일한 의미는 더 이상 볼 수 없다는 것입니다.

내가 당신을 알고는 C 질문이지만, 스레드 구현의 많은이 같은 뭔가 문제를 해결 :

class Thread { 
    pthread_t handle; 

    static void * start (void * self) { 
     static_cast <Thread *> (self) -> run(); 
    } 

    protected: void run() = 0; 

    public: void start() { 
     pthread_create (&handle, NULL, start, this); 
    } 

    ~ Thread() { 
     pthread_join (&handle, NULL); 
    } 
}; 
당신은 C와 유사한 뭔가를 할 수

에서, argmalloc 에디션에 대한 포인터가

스레드 핸들을 포함하는 struct; 스레드 기능은 종료시에 frees입니다.

관련 문제