循环中的打印功能仅在循环退出后打印所有内容

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之后fflushstdout

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.

处理多个线程