최근에 여러 스레딩에 대해 배우려고 노력했으며 다음과 같은 예기치 않은 문제가 발생했습니다. 최소한 간단한 동작으로 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을 사용하여 잠금 해제하면 상황을 개선하는 데 아무런 영향을 미치지 않습니다.
'버퍼'를 '휘발성'으로 선언하지 않았습니다. 도움이되지 않습니다. –
'printf()'를 호출 할 때마다'fflush (stdout);'을 실행 해보고 변경이 가능한지 살펴볼 수 있습니까? –
이것을 컴파일하는데 필요한'#include '를 포함했다면, 매우 좋은 질문이 될 것입니다. – Flexo