C中的忙循环是什么



我正在研究如何用C编写shell,我发现了一种使用"当执行等待命令时围绕睡眠功能的繁忙循环";。在循环中,使用while(1)循环。我想无条件地循环,从而占用一些处理时间和空间?繁忙循环的确切目的是什么?此外,如果懒惰循环中的唯一目标是有一个无条件循环,那么我们就不能使用任何其他形式的循环,比如for(;;)而不是while(1)吗?

繁忙循环是一种故意浪费时间等待事情发生的循环。通常,您希望不惜一切代价避免繁忙循环,因为它们什么都不做会消耗CPU时间,因此会浪费资源,但在极少数情况下可能需要它们。

其中一种情况确实是当你需要长时间睡眠,并且你安装了一些信号处理程序,可能会中断睡眠。然而;睡眠繁忙循环";这几乎不是一个繁忙的循环,因为几乎所有的时间都花在了睡觉上。

在给定适当的控制代码的情况下,forwhiledo ... whilegoto都是C中的可互换结构之后,您可以使用您喜欢的任何循环结构来构建繁忙循环。

下面是一个使用clock_nanosleep:的示例

// I want to sleep for 10 seconds, but I cannot do it just with a single
// syscall as it might get interrupted, I need to continue requesting to
// sleep untill the entire 10 seconds have elapsed.
struct timespec requested = { .tv_sec = 10, .tv_nsec = 0 };
struct timespec remaining;
int err;

for (;;) {
err = clock_nanosleep(CLOCK_MONOTONIC, 0, &requested, &remaining);

if (err == 0) {
// We're done sleeping
break;
}
if (err != EINTR) {
// Some error occurred, check the value of err
// Handle err somehow
break;
}

// err == EINTR, we did not finish sleeping all the requested time
// Just keep going...
requested = remaining;
}

实际繁忙循环看起来如下,其中var应该是由其他人(例如另一个线程(设置的某种原子变量:

while (var != 1);
// or equivalent
while (1) {
if (var == 1)
break;
}

不用说,这是您希望避免的循环,因为它不断检查浪费CPU的情况。一个更好的实现是使用信号、pthread条件变量、信号量等。通常有很多不同的方法来避免繁忙的循环。

最后,请注意,在上述情况下,正如@einpoklum在评论中所说,编译器可能会"优化";通过放弃对var的检查来清除整个循环体,除非它知道它可能会更改。volatile限定符可能会有所帮助,但这实际上取决于场景,不要把上面的代码当作一个愚蠢的例子。

最新更新