我不仅在这段代码中而且在其他一些代码中也遇到过这个问题。
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编译器
答案 0 :(得分:2)
stdout
流被缓冲,您要打印的数字仅在您打印换行符时显示。
每个stdout
之后解决方案是fflush
printf
。
printf("\t%d",i);
fflush(stdout);
有关详细信息,请参阅Why does printf not flush after the call unless a newline is in the format string?
答案 1 :(得分:1)
这几乎肯定与通过printf()
到stdout
使用缓冲输出有关。
把这个带给你的老师。您正在使用某种私有线程接口,并且不清楚所涉及的线程库是否足够智能以使用stdout
处理多个线程。