2012-01-10 2 views
0

최근에 여러 스레딩에 대해 배우려고 노력했으며 다음과 같은 예기치 않은 문제가 발생했습니다. 최소한 간단한 동작으로 printf는 매우 단순한 코드에서 호출 할 때 한 줄에 한 줄 이상을 인쇄하지 않습니다.이것은 printf()/pthread 버그입니까, 아니면 누락 되었습니까?

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 
    pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 
    char buffer[2]; 

    void * thread_routine(void * args){ 
     pthread_mutex_lock(&mutex); 
     pthread_cond_wait(&cond, &mutex); 
     printf("test %s\n test\n", buffer); 
     pthread_mutex_unlock(&mutex); 
     return(NULL); 
    } 

    int main(void){ 
     pthread_t thread; 
     pthread_create(&thread, NULL, thread_routine, NULL); 
     sleep(1); 
     buffer[0] = 'c'; 
     buffer[1] = '\0'; 
     pthread_mutex_lock(&mutex); 
     pthread_cond_signal(&cond); 
     pthread_mutex_unlock(&mutex); 
     sleep(10); 
     return(0); 
    } 

출력은

test prompt$] 

이 코드에 어떤 문제가 (10 초 기다렸다가)

test c 

입니까? 어떻게 printf에 한 번에 두 줄을 인쇄 할 수 없습니까? flockfile을 사용하여 stdout을 차단하고 funlockfile을 사용하여 잠금 해제하면 상황을 개선하는 데 아무런 영향을 미치지 않습니다.

+0

'버퍼'를 '휘발성'으로 선언하지 않았습니다. 도움이되지 않습니다. –

+4

'printf()'를 호출 할 때마다'fflush (stdout);'을 실행 해보고 변경이 가능한지 살펴볼 수 있습니까? –

+0

이것을 컴파일하는데 필요한'#include '를 포함했다면, 매우 좋은 질문이 될 것입니다. – Flexo

답변

2

프로그램이 말한대로 끝에 test prompt$]을 인쇄 한 경우 실행 한 버전에 "test %s\n test\n"에 두 번째 줄 바꿈이 없음을 의미합니다.

줄 바꿈은 화면 출력이 플러시 될 때 중요하므로 중요합니다. 설명 및 권장 사항은 Why does printf not flush after the call unless a newline is in the format string?을 참조하십시오.

질문에서 정확한 코드를 다시 컴파일하고 다시 실행 해보십시오. 기대했던대로 작동 할 것입니다 (확실히 제 박스에서 작동합니다).

+0

사실, 그의 질문에 * 정확한 코드 *가 컴파일되지 않습니다. 적어도 하나의'#include '가 빠져 있습니다. –

+0

많은 것을 Thak. 그 사실을 알지 못했고 문자열이 즉시 인쇄 될 것으로 예상했습니다. 고맙습니다. –

관련 문제