Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重新获取线程保证使用的各种缓存线)内核将短暂地忙碌等待,直到延迟实际过期。这允许内核将控制权传递回线程,非常接近延迟到期_C++_C_Posix_Sleep - Fatal编程技术网

C++ 重新获取线程保证使用的各种缓存线)内核将短暂地忙碌等待,直到延迟实际过期。这允许内核将控制权传递回线程,非常接近延迟到期

C++ 重新获取线程保证使用的各种缓存线)内核将短暂地忙碌等待,直到延迟实际过期。这允许内核将控制权传递回线程,非常接近延迟到期,c++,c,posix,sleep,C++,C,Posix,Sleep,例如,如果您请求睡眠123纳秒,那么调度程序可能不会给您100纳秒的CPU时间,然后它可能会花10纳秒切换到您的线程,然后它可能会忙着等待剩余的13纳秒。即使在这种情况下(在忙等待完成的情况下),它通常也不会在整个延迟期间忙等待。但是,如果延迟非常短,内核将只执行最后的忙等待 最后,有一个值得一提的特殊情况。在POSIX系统上sleep(0)通常被滥用为yield()。我不太确定这种做法是否合法——调度器不可能支持类似于yield()的东西,除非该调度器愿意在更重要的工作等待时浪费CPU时间做不

例如,如果您请求睡眠123纳秒,那么调度程序可能不会给您100纳秒的CPU时间,然后它可能会花10纳秒切换到您的线程,然后它可能会忙着等待剩余的13纳秒。即使在这种情况下(在忙等待完成的情况下),它通常也不会在整个延迟期间忙等待。但是,如果延迟非常短,内核将只执行最后的忙等待


最后,有一个值得一提的特殊情况。在POSIX系统上
sleep(0)
通常被滥用为
yield()
。我不太确定这种做法是否合法——调度器不可能支持类似于
yield()
的东西,除非该调度器愿意在更重要的工作等待时浪费CPU时间做不重要的工作。

问题出了什么问题?“问题出了什么问题?”太宽泛了。特定于操作系统,特定于实现。POSIX没有指定它应该如何实现。睡眠通常会将进程放入等待队列,在等待队列中,一旦睡眠期结束,将等待重新安排。因此,当操作系统决定切换上下文(通常由计时器触发)时,它将浏览排队的进程并激活一个已准备好执行的进程(加上一些优先级优势)。@Archie通常将进程/线程放入按过期时间排序的队列样式容器中。操作系统不需要浏览-它只需将项目弹出到队列的最前面。我不是在寻找高分辨率,我更担心其他线程在不断切换上下文时的性能,因为我有一个线程在99.9%的时间内睡眠(有睡眠(30)),30秒是永恒的,您可以安全地丢弃线程CPU数量,即使睡眠时间为几毫秒,系统也不会注意到。注意:此问题当前标记为,而不是。在POSIX中,
nanosleep
不能用旋转锁实现。线程需要挂起。linux中是否存在这种情况是另一个问题,因为linux不符合POSIX。
{ // on a thread other than main() thread
  while(1)
  {
    //do something
    sleep(1);
  }
}
   #include <stdio.h>
   #include <stdlib.h>
   #include <sys/time.h>
   #include <sys/types.h>
   #include <unistd.h>

   int
   main(void)
   {
       fd_set rfds;
       struct timeval tv;
       int retval;

       /* Watch stdin (fd 0) to see when it has input. */
       FD_ZERO(&rfds);
       FD_SET(0, &rfds);

       /* Wait up to five seconds. */
       tv.tv_sec = 5;
       tv.tv_usec = 0;

       retval = select(1, &rfds, NULL, NULL, &tv);
       /* Don't rely on the value of tv now! */

       if (retval == -1)
           perror("select()");
       else if (retval)
           printf("Data is available now.\n");
           /* FD_ISSET(0, &rfds) will be true. */
       else
           printf("No data within five seconds.\n");

       exit(EXIT_SUCCESS);
   }