在c中的一个线程中Sleep()

时间:2017-07-11 12:10:13

标签: c

我希望我的程序打印

  • 第1秒你好
  • 你好,在第二秒
  • 第3秒你好。

所以我写了下面的代码。 实际发生的是

  • 第一秒 - 没什么
  • 第二秒 - 没什么
  • 第3秒 - HelloHelloHello

如何纠正?

实际发生的事情是我

void *myThreadFun(void *vargp)
{
    while (1)
    {
        sleep(1);
        printf("hello");
    }
}

2 个答案:

答案 0 :(得分:4)

试试这个,您需要刷新流,可以通过fflush或添加\n来完成。

由于系统调用成本高昂,

printf并不总是因性能原因而调用write。它会缓冲它并在需要时立即写入。通过添加,\nfflush使缓冲区每次都在stdout上打印。

void *myThreadFun(void *vargp)
{
    while(1){
        printf("hello\n");
        sleep(1);
    }
}

答案 1 :(得分:2)

C stdio 缓冲,支持三种不同的模式:

  • unbuffered :所有内容都直接读取或写入
  • 行缓冲:数据保留在缓冲区中,直到它已满或遇到换行符
  • 完全缓冲:数据保存在缓冲区中,直到满了

您始终可以使用fflush()强制缓冲区刷新。因此,在fflush(stdout)之后添加printf()即可。

由于stdout行缓冲模式下默认为 ,您也可以在字符串中附加\n(换行符),换行将触发缓冲区刷新。