2017-10-27 6 views
0
#include <pthread.h> 
#include <cstdio> 

void *printa(void *) { 
    printf("a"); 
    return NULL; 
} 

void *printb(void *) { 
    printf("b"); 
    return NULL; 
} 

int main() { 
    pthread_t pa, pb; 
    pthread_create(&pa, NULL, printa, NULL); 
    pthread_create(&pb, NULL, printb, NULL); 
    for(;;); 
} 

"a"와 "b"를 순서에 관계없이 인쇄 할 수 있지만 아무 것도 인쇄하지 않고 실행하고 종료 할 수 있습니다. 왜? ADD : 이유는 스레드가 실행되기 전에 주 기능 종료입니다. 그래서 for (;;);를 추가합니다. 메인의 끝에서 "a"와 "b"는 절대로 인쇄되지 않는 것 같습니다.이 코드 조각이 출력없이 실행되는 이유는 무엇입니까 (약 pthread)?

답변

2

여러분의 프로그램은 스레드가 처리를 완료하기 전에, 각 스레드가 pthread_join

+1

... 또는 초기 프로세스 종료를 막는 다른 메커니즘. –

1

printf (실제로 표준 출력)가 완료 될 때까지 일반적으로 라인 버퍼링 기다릴 필요가 종료됩니다. printf(3)setvbuf(3)stdio(3)을 참조하십시오. 그래서

어느 쪽이 당신의 printf\n를 추가, 또는 두 가지 모두에 (아마도 fflush(NULL); 등 ....) fflush(3)를 호출 ... "a""b" 문자열 stdout의 내부 버퍼를 유지하고 당신은 모든 출력을 준수하지 않는 printaprintb. flockfile(3)도 참조하십시오.

그리고 당신은 pthread_create에 호출 후 main 모두 papbpthread_join(3)를 호출해야합니다, 또는 다른 예를 들어, 스레드를 분리 한 pthread_detach(3). this도 참조하십시오.

좋은 것을 읽으십시오. Pthread tutorial. pthreads(7)도 참조하십시오.

중간에 바쁜 루프 for(;;);은 나쁜 맛입니다. 환경 친화적이지 않습니다. 쓸데없는 힘을 낭비하고 있습니다. 어떤 아이들은 아마도 sleep(3), nanosleep(2), pause(2), 등을 사용하면 좋을 것이다. 또는 일부 event loop (약 poll(2) 등 ...) 물론 pthread_join에 대한 호출은 스레드가 종료 될 때까지 대기합니다.