奇怪的列表打印函数行为。“如果我打印,则有效”\n‘;,不';如果我把它取下来,它就不工作了 有时候C++给了我很大的时间。我真的想不出为什么这样做不起作用,如果你们知道的话,我会很高兴的

奇怪的列表打印函数行为。“如果我打印,则有效”\n‘;,不';如果我把它取下来,它就不工作了 有时候C++给了我很大的时间。我真的想不出为什么这样做不起作用,如果你们知道的话,我会很高兴的,c++,printf,C++,Printf,我在线程上每秒调用一次这个函数 此代码有效(打印正在迭代的列表上的内容): void DeltaList::print() { pthread_mutex_lock(&mutex); printf(“\n”); 列表::迭代器; for(it=deltas.begin();it!=deltas.end();it++) { printf(“%d”,(int)(*it)->timeleft); } pthread_mutex_unlock(&mutex); } 这个没有(没有打印任何内容): vo

我在线程上每秒调用一次这个函数

此代码有效(打印正在迭代的列表上的内容):

void DeltaList::print()
{
pthread_mutex_lock(&mutex);
printf(“\n”);
列表::迭代器;
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”);
列表::迭代器;
for(it=deltas.begin();it!=deltas.end();it++)
{
printf(“%d”,(int)(*it)->timeleft);
}
pthread_mutex_unlock(&mutex);
}

那么\n在stdout是控制台时隐式地刷新缓冲区。如果您希望每一个调用都立即显示它的输出,请调用C++ <代码> FFLUH(STDUT)。操作系统正在缓冲您的输出,
\n
在stdout是控制台时隐式地刷新缓冲区。如果希望每个调用立即显示其输出,请在循环后调用
fflush(stdout)

我猜这是因为stdout被缓冲,而打印\n会刷新缓冲区-请参阅我猜这是因为stdout被缓冲,打印\n会刷新缓冲区-请参见切换到使用std::cerr作为实验,我敢打赌每次打印都很好,因为缓冲cout/printf(标准输出)时不会缓冲标准错误。在末尾放置一个std::endl将缓冲区刷新,并为cout输出一个新行,该行也可以工作。您也可以简单地处理standard out,并在流上调用flush函数,以确保其打印到控制台,这将是类似的。

切换到使用std::cerr作为实验,我敢打赌,它每次打印都很好,因为在缓冲cout/printf(standard out)时不会缓冲标准错误。在末尾放置一个std::endl将缓冲区刷新,并为cout输出一个新行,该行也可以工作。您也可以简单地处理标准输出,并在流上调用flush函数,以确保其打印到控制台,而控制台与之类似。

WORKS=真正打印列表上的内容。不工作=什么也不做,什么也不打印。printf是我更改的代码的唯一部分。这对我来说太合乎逻辑了,以至于我忘了提出这个问题,现在就编辑它。它会永远阻塞吗?i、 e.它是否离开过函数?printf(“\n”)强制刷新输出缓冲区。可能发生的情况是,它正在打印到内部缓冲区,而您打印的内容不足以强制它刷新。等待一段时间以填充缓冲区或强制其刷新。Loki是正确的。输出是缓冲的,在打印足够的缓冲区以填充和刷新之前,如果不显式地使用
\n
刷新或调用
fflush()
.WORKS=真正打印列表中的内容,您将无法看到输出。不工作=什么也不做,什么也不打印。printf是我更改的代码的唯一部分。这对我来说太合乎逻辑了,以至于我忘了提出这个问题,现在就编辑它。它会永远阻塞吗?i、 e.它是否离开过函数?printf(“\n”)强制刷新输出缓冲区。可能发生的情况是,它正在打印到内部缓冲区,而您打印的内容不足以强制它刷新。等待一段时间以填充缓冲区或强制其刷新。Loki是正确的。输出是缓冲的,在打印足够的内容以填充和刷新缓冲区之前,如果不显式地使用
\n
刷新或调用
fflush()
,您将无法看到它。我从未想过这一点。。只是一个简单的问题(我现在不想尝试):如果我在stdout中打印太多字符(比如内存大小)而没有“\n”,会发生什么?缓冲区在填满时也会刷新。
stdout
在调用
exit()
或从
main
返回时也会刷新,所以数据最终应该被打印出来我从没想过。。只是一个简单的问题(我现在不想尝试):如果我向stdout打印太多字符(比如内存大小)而没有“\n”会发生什么?缓冲区在填满时也会被刷新。
stdout
在调用
exit()
或从
main
返回时也会被刷新,因此最终应该打印数据。
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);
}