循环中的打印功能仅在循环退出后打印所有内容
print function in loop only printing everything after loop exits
我不仅在这段代码中而且在其他一些代码中都遇到过这个问题。
printf 函数置于 for 循环中。它应该在每次迭代时打印(循环传递)。但是它会在循环退出后一次性打印所有内容。
在当前示例中,我正在使用线程。但是我写的其他不涉及线程的程序也遇到了同样的问题。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "threads.h"
ElementPtr RunQ;
void *loop1(void)
{
int i;
while(1)
for(i=1;i<100;i++)
{
printf("\t%d",i);
if(i%8 == 0)
{
printf("\n");
yield();
}
usleep(500000);
}
}
void *loop2(void)
{
int i;
while(1)
for(i=201;i<300;i++)
{
printf("\t%d",i);
if(i%4 == 0)
{
printf("\n");
yield();
}
sleep(1);
}
}
void *loop3(void)
{
int i;
while(1)
for(i=501;i<600;i++)
{
printf("\t%d",i);
if(i%15 == 0)
{
printf("\n");
yield();
}
usleep(500000);
}
}
int main()
{
InitQueue(&RunQ);
printf("\nRunning threads:\n");
start_thread(&loop1);
start_thread(&loop2);
start_thread(&loop3);
run();
return 0;
}
输出完全正确。唯一的问题是它一次打印每一行,而不是一个一个地打印每个数字。所以第一个循环会等待 4 秒,然后一次打印 1 到 8,然后切换到等待 4 秒然后打印的线程 2,依此类推。
它应该一次打印一个数字。我做错了什么?
P.S。我在 Ubuntu 14.10
上使用 gcc 编译器
stdout
流被缓冲,您要打印的数字仅在打印换行符时显示。
解决方法是在每个printf
之后fflush
stdout
。
printf("\t%d",i);
fflush(stdout);
有关详细信息,请参阅 Why does printf not flush after the call unless a newline is in the format string?
这几乎肯定与通过 printf()
到 stdout
使用缓冲输出有关。
把这个交给你的老师。您正在使用某种私有线程接口,并且不清楚所涉及的线程库是否足够智能以使用 stdout
.
处理多个线程
我不仅在这段代码中而且在其他一些代码中都遇到过这个问题。
printf 函数置于 for 循环中。它应该在每次迭代时打印(循环传递)。但是它会在循环退出后一次性打印所有内容。
在当前示例中,我正在使用线程。但是我写的其他不涉及线程的程序也遇到了同样的问题。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "threads.h"
ElementPtr RunQ;
void *loop1(void)
{
int i;
while(1)
for(i=1;i<100;i++)
{
printf("\t%d",i);
if(i%8 == 0)
{
printf("\n");
yield();
}
usleep(500000);
}
}
void *loop2(void)
{
int i;
while(1)
for(i=201;i<300;i++)
{
printf("\t%d",i);
if(i%4 == 0)
{
printf("\n");
yield();
}
sleep(1);
}
}
void *loop3(void)
{
int i;
while(1)
for(i=501;i<600;i++)
{
printf("\t%d",i);
if(i%15 == 0)
{
printf("\n");
yield();
}
usleep(500000);
}
}
int main()
{
InitQueue(&RunQ);
printf("\nRunning threads:\n");
start_thread(&loop1);
start_thread(&loop2);
start_thread(&loop3);
run();
return 0;
}
输出完全正确。唯一的问题是它一次打印每一行,而不是一个一个地打印每个数字。所以第一个循环会等待 4 秒,然后一次打印 1 到 8,然后切换到等待 4 秒然后打印的线程 2,依此类推。
它应该一次打印一个数字。我做错了什么?
P.S。我在 Ubuntu 14.10
上使用 gcc 编译器stdout
流被缓冲,您要打印的数字仅在打印换行符时显示。
解决方法是在每个printf
之后fflush
stdout
。
printf("\t%d",i);
fflush(stdout);
有关详细信息,请参阅 Why does printf not flush after the call unless a newline is in the format string?
这几乎肯定与通过 printf()
到 stdout
使用缓冲输出有关。
把这个交给你的老师。您正在使用某种私有线程接口,并且不清楚所涉及的线程库是否足够智能以使用 stdout
.