Это ошибка printf () / pthread или я что-то упустил? - PullRequest
0 голосов
/ 10 января 2012

Я недавно попытался узнать о многопоточности и столкнулся со следующим неожиданным - по крайней мере для меня - поведением: printf просто не будет печатать сразу более одной строки при вызове в очень простом следующем коде:

    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 c

(подождите 10 секунд и)

    test prompt$]

Что не так с этим кодом?Почему я не могу заставить printf печатать две строки одновременно?Обратите внимание, что блокировка стандартного вывода с помощью flockfile и разблокировка с помощью funlockfile не поможет улучшить ситуацию.

1 Ответ

2 голосов
/ 10 января 2012

Если ваша программа напечатала test prompt$] в конце, как вы говорите, это означает, что в версии, которую вы выполнили, не было второй новой строки в "test %s\n test\n".

Новые строки важны, так как этокогда вывод сбрасывается на экран.См. Почему printf не сбрасывается после вызова, если в строке формата нет новой строки? для объяснения и рекомендаций.

Попробуйте перекомпилировать и повторно выполнить точный код из вашего вопросаи держу пари, что это сработает, как и ожидалось (это, безусловно, работает на моей коробке).

...