何时以及为何需要sleep()?

Mai*_*nID 2 c c++ operating-system

cout<<"abcd";

sleep(100);

cout<<'\b';
Run Code Online (Sandbox Code Playgroud)

如果我想打印出字符串然后取回一个字符,为什么这里需要sleep()?

但是当在C中使用printf时,似乎没有必要,为什么呢?

char* a = "12345";
char* b = "67890";
threadA(){cout<<a;}
threadB(){cout<<b;}

beginthread (threadA);
sleep(100);
beginthread (threadB);
Run Code Online (Sandbox Code Playgroud)

在上面的第二个伪代码中,使用sleep()是否正确?

bay*_*yda 25

计算明天的日期:

void get_tomorrow_date( struct timeval *date )
{
    sleep( 86400 ); // 60 * 60 * 24
    gettimeofday( date, 0 );
}
Run Code Online (Sandbox Code Playgroud)

;)

  • 现在尝试编写一个日历应用程序:D (3认同)

dir*_*tly 9

您需要了解两个微妙的问题:

  • 多线程
  • I/O和缓冲

我会试着给你一些想法:

多线程和睡眠

拥有一个sleep在线程环境中是有道理的.该sleep调用使您等待,从而为初始线程提供一些范围以完成其处理,即abcd在另一个线程插入退格字符之前将字符串写出到标准输出.如果您没有等待第一个线程完成其处理,那么您首先编写了退格字符,然后是字符串abcd,并且不会发现任何差异.

缓冲I/O.

I/O通常发生在缓冲,非缓冲和半缓冲状态.这可能会影响您必须等待输出显示在控制台上的时间长度(如果有的话).

您的cout实现可能使用缓冲模型.尝试添加换行符或语句endl末尾cout以打印新行并立即刷新,或使用cout << "abcd" << flush;刷新而不打印新行.


Aln*_*tak 5

在没有睡眠第二种情况下有一个渺茫的机会,第二个线程可能会开始之前的第一个工作日,导致输出"6789012345".

但是,"休眠"并不是处理线程之间同步的方法.您通常会使用一个信号灯或类似的threadA(),其threadB()必须等待做工作之前.