Странное поведение функции печати списка.Работает, если я печатаю "\ n", не работает, если я его удаляю - PullRequest
0 голосов
/ 15 ноября 2011

Иногда с ++ играет меня отлично. Я действительно не могу понять, почему это работает / не работает, и я был бы счастлив, если бы кто-нибудь из вас знал.

Я вызываю эту функцию один раз в секунду в потоке.

Этот код РАБОТАЕТ (печатает то, что находится в списке, который повторяется):

void DeltaList::print()
{
  pthread_mutex_lock (&mutex);
  printf("\n");
  list<Delta*>::iterator it;
  for(it=deltas.begin(); it!=deltas.end(); it++)
  {
    printf("%d   ", (int) (*it)->timeleft);
  }

  pthread_mutex_unlock (&mutex);
}

Этот НЕ ДЕЛАЕТ (ничего не напечатано):

void DeltaList::print()
{
  pthread_mutex_lock (&mutex);
  //printf("\n");
  list<Delta*>::iterator it;
  for(it=deltas.begin(); it!=deltas.end(); it++)
  {
    printf("%d   ", (int) (*it)->timeleft);
  }

  pthread_mutex_unlock (&mutex);
}

Итак ...?

Ответы [ 3 ]

3 голосов
/ 15 ноября 2011

Это не имеет ничего общего с многопоточностью или C ++. ОС буферизует ваш вывод, и \n неявно сбрасывает буфер, когда stdout является консолью. Позвоните fflush(stdout) после цикла, если вы хотите, чтобы каждый вызов показывал свой вывод немедленно.

0 голосов
/ 15 ноября 2011

Переключитесь на использование std :: cerr в качестве эксперимента, и я готов поспорить, что он печатается нормально каждый раз, потому что стандартная ошибка не буферизуется, пока буферизуется cout / printf (standard out). Размещение std :: endl в конце приведет к сбросу буфера и выведет новую строку для cout, которая также должна работать. Вы также можете просто работать со стандартным выходом и вызывать функцию очистки потока, чтобы обеспечить ее вывод на консоль, что будет похоже.

0 голосов
/ 15 ноября 2011

Полагаю, это потому, что STDOUT буферизуется, и печать \ n очищает буфер - см. SO о поведении printf \ n

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...