2010-11-19 7 views
5

이 코드의 동작은 잘 정의되어 있습니까? 당신이 실제 응용 프로그램에서이 작업을 수행하는 이유메인 스레드에서 pthread_join을 호출하는 것이 유효합니까?

#include <stdio.h> 
#include <pthread.h> 

pthread_t mt; 

void *start(void *x) 
{ 
    void *y; 
    pthread_join(mt, &y); 
    printf("joined main thread\n"); 
    return 0; 
} 

int main() 
{ 
    pthread_t t; 
    mt = pthread_self(); 
    pthread_create(&t, 0, start, 0); 
    pthread_exit(0); 
} 

답변

7

예, 가능합니다. 사실,이 가능성은 pthread_detach()이 존재하는 주된 이유 중 하나입니다. pthread_detach()의 POSIX 워드 프로세서 (man pthread_detach 참조)에서 :

It has been suggested that a "detach" function is not necessary; the 
    detachstate thread creation attribute is sufficient, since a thread 
    need never be dynamically detached. However, need arises in at least 
    two cases: 

    1. In a cancellation handler for a pthread_join() it is nearly essen- 
     tial to have a pthread_detach() function in order to detach the 
     thread on which pthread_join() was waiting. Without it, it would 
     be necessary to have the handler do another pthread_join() to 
     attempt to detach the thread, which would both delay the cancella- 
     tion processing for an unbounded period and introduce a new call 
     to pthread_join(), which might itself need a cancellation handler. 
     A dynamic detach is nearly essential in this case. 


    2. In order to detach the "initial thread" (as may be desirable in 
     processes that set up server threads). 

그래서 당신이 제안하고 어떤 기준에 따라 괜찮습니다.

편집 : 그냥 그 더 확인하려면 POSIX description of exec() 미국 : PTHREAD_CREATE_JOINABLE로 설정 detachstate 속성 을 만든 것처럼

새로운 프로세스 이미지의 초기 스레드, 조인한다. 당신이 main의 끝에서 pthread_exit을하고 있기 때문에

+0

마지막 편집을 위해 소스에 대한 링크를 추가 하시겠습니까? 나는 당신이 여기에서 얻은 것 같아요 : http://pubs.opengroup.org/onlinepubs/009695399/functions/exec.html,하지만 먼저 확인하고 싶었습니다. 훌륭한 대답, 그래! – currysensei

+1

@currysensei : 추가되었습니다! – psmears

0

내가 상상할 수 없다 (하나 생각할 수있는 경우에 누군가가 예를 언급 해주십시오),하지만 난 그게 가능하다조차 생각하지 않는다. 내가 보았던 pthreads에 관한 모든 검색은 항상 보조 스레드가 아닌 주 스레드에서 호출되는 조인을가집니다.

조인을하려면 조인하려는 스레드가 PTHREAD_CREATE_JOINABLE 플래그로 작성되어야합니다. 주 스레드가 그렇게 생성되었는지 여부를 나타내는 문서를 찾을 수 없었습니다.

Codeguru도 이와 유사한 질문이 있습니다. here이 질문에 대한 답변을 명확히하지 못할 수도 있습니다.

당신이 달성하고자하는 메인 쓰레드가 종료 된 후에는 분리 된 자식 스레드를 만들거나 fork/vfork 대신, 어떤 플랫폼에 따라 당신이있어 사용해야 계속 자식 스레드 인 경우.

+0

POSIX에 따르면'PTHREAD_CREATE_JOINABLE'이 기본값입니다. 그것을 얻기 위해'pthread_attr_t '를 사용할 필요가 없다. –

+0

그건 그렇고 좋은 일은 아니라는 데 동의합니다. 필자는 애플리케이션 작성자가 사용해야하는지 여부가 아니라 구현이이 모호한 사용법을 지원해야하는지 여부의 관점에서 질문했습니다. :-) –

0

귀하의 접근 방식은 특히, 나에게 공식적으로 유효 보인다.

한편, main의 초기 스레드가 결합 가능해야하는지 여부는 POSIX에서 발견되지 않았습니다. psmears의 대답에 대한 이론적 근거는 main이 결합 가능하게 만들어지면 분리 가능해야한다는 것입니다.

다른 악의적 인 사람이 pthread_detach을 main이라는 전화 서브 루틴에서 호출 할 수도 있습니다. 따라서 확실하게 반환 값 pthread_join을 확인하여 이러한 경우를 확인해야합니다. start가에 대한 액세스를 Mutexing pthread_join

에 도착하기 전에

  • main이 종료 될 수 있습니다

    귀하의 예제 코드에서 또한

    당신은 start의 생성과 main의 종료 사이에 경쟁이 mt 변수가이를 수용해야합니다.

+0

'pthread_detach'가 이미 스레드에서 호출 되었다면, 그 스레드에서'pthread_join'을 호출 한 결과는 정의되지 않습니다; 오류를 리턴 할 필요는 없으며 실제로 스레드가 종료되고 자원이 할당 해제 된 경우 충돌이 발생할 수 있습니다. –

+0

주 스레드가 결합 가능하다고 가정하면'main'이'pthread_join'을 호출하기 전에'pthread_exit'를 호출하면 문제가 없습니다. 결합 가능한 스레드의 의미는 하위 프로세스의 'pid'와 같습니다. 'pid'가 기다렸다가 종료 상태를 수집 할 때까지'pid'가 예약되어 있기 때문에 ('좀비 프로세스 '처럼),'pthread_t'는 스레드를 분리하거나 결합 할 때까지 유효합니다. –

+0

첫 발언에 동의하지 않습니다. 결합 할 수없는 스레드는 감지 가능하며 정의되지 않은 결과를 초래하지 않습니다. 'pthread_join() 함수는 다음 경우에 실패합니다 : * EINVAL * thread가 지정한 값이 조인 가능한 스레드를 참조하지 않는다는 것을 구현이 감지했습니다. ' –

관련 문제