循环中的print函数只在循环退出后打印所有内容

时间:2015-03-19 20:21:40

标签: c multithreading loops gcc printf

我不仅在这段代码中而且在其他一些代码中也遇到过这个问题。

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编译器

2 个答案:

答案 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处理多个线程。