为什么使用select()而不是sleep()?

Ben*_*hen 15 c multithreading posix

我正在编写一个关于iPhone音频的章节,并且遇到了一段我无法理解的代码:

while (aqc.playPtr < aqc.sampleLen) 
{
    select(NULL, NULL, NULL, NULL, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

(完整代码示例在第163-166页).根据我对代码的理解,音频正在另一个线程上处理,而while循环就是为了防止主线程在音频仍在处理时终止.

我不明白的是为什么select()要用来代替sleep().

从我所读到select()的用于监视I/O的变化并传递它的NULL并没有做任何有意义的事情.我已经运行了代码sleep(),它按预期工作.(我对低级别POSIX的了解几乎不存在.)

kri*_*iss 19

选择允许准确的次秒等待,并且比睡眠更便携.还有其他方法可以等待,请看这个问题.

但是select的timeout参数不应该是float而是指向struct timeval的指针.我对您展示的代码甚至编译感到惊讶.更多:这个奇怪的条件选择之后是无条件睡眠(1).对我来说看起来毫无意义.


nin*_*alj 11

使用select()NULL rfds,wfds并且efds是与亚秒级分辨率便携睡觉的习惯的方法.


cmc*_*abe 5

那么,睡眠(3)可以通过使用信号来实现.这取决于平台.

当您使用select(2)和poll(2)时,您知道不会涉及任何信号,这通常非常有用.例如,如果你正在使用alarm(2),你也不应该使用sleep(3),因为"混合调用警报和睡眠是一个坏主意"(根据手册页.)

此外,select和poll在睡眠时会给你毫秒级的粒度,但是睡眠只有几秒钟的粒度.