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