2012-05-28 8 views
0

실행되지 않습니다 : 그것은 주요 프로세스 후에도 실행해야하므로 분리 상태, 스레드가없는 조인해야스레드가 생성 (분리) 나는이 코드를 작성했습니다

void* th (void* arg) 
{ 
    sleep(1); 
    for(int i=0; i<1000;i++) 
    { 
    fprintf(stderr,"%d\t",i); 
    } 
    pthread_exit(NULL); 
} 

int main(int argc, char** argv) 
{ 
    pthread_t thread; 
    pthread_attr_t attr; 
    pthread_attr_init(&attr); 
    pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); 
    pthread_create(&thread,&attr,th,NULL); 
    pthread_attr_destroy(&attr); 
    return 0; 
} 

을 terminated.But 그렇지 않습니다 숫자를 출력해라, 내가 본 모든 것은 스레드가 stderr에 아무 것도 인쇄하지 않고 종료되었다는 것이다.
분리 된 스레드가 실행되지 않는 이유는 무엇입니까?

+0

대신 실제 파일로 인쇄해볼 수 있습니까? –

답변

6

main 스레드의 return 스레드는 전체 프로세스의 exit과 동일하므로 스레드가 아무 것도 인쇄하기 전에 프로세스가 종료됩니다. 대신 해당 스레드를 종료하려면 pthread_exit을 사용하십시오.

+0

그리고 'sleep (1)'로 판단하면 다른 것을 실행하지 않을 것입니다. –

+0

또한 메인 프로세스는 스레드로 간주됩니까? 이 코드에는 두 개의 스레드가 있습니까? –

+0

아니요, 프로세스는 처음에는 하나의 스레드로 구성됩니다. 'pthread_create' 후에 잠시 두 개의 스레드가 있습니다. 그러면'main'이 반환되어 암시 적으로'exit'가 호출되고 프로세스가 사라집니다. –

-1

원본 코드 샘플에 실행 조건이 있습니다. attr_destroy 앞에 sleep (5)을 추가하십시오.

+2

아니요,'pthread_attr_destroy'를 즉시 호출하는 것은 합법적입니다. 더욱이, 'sleep'은 결코 인종 * 조건을위한 해결책이 아닙니다. –

+0

일종의. 1 포인트 예,하지만 그것은 논쟁의 여지가 없습니다. 2 점. 이것은 결정된 결정론을 부과하는 것처럼 확실한 해결책입니다. 위의 코드는 프로세서가 매우 사용량이 많은 경우 출력을 생성합니다. 스레드는 프로세스 외부에 존재할 수 없기 때문에 두 스레드와 함께 사라지는 프로세스는 하나뿐입니다. – Barry

+1

대부분의 조건에서 "작동"한다고하더라도, 스레드를 새로 배우는 사람에게 동기화 기본으로 'sleep'을 가르치는 것은 무책임합니다. 사실,'sleep '을 호출하는 코드가 버그라고 말할 정도로 거의 갈 것입니다. 즉,'sleep'이 실제로 잘못하지는 않는'sleep'으로 달성 할 수있는 것이 거의 없습니다. –

관련 문제