Я работаю через главу об аудио iPhone и столкнулся с разделом кода, который я не могу понять:
while (aqc.playPtr < aqc.sampleLen)
{
select(NULL, NULL, NULL, NULL, 1.0);
}
(Полный пример кода находится на страницах 163-166). Из того, что я понимаю кода, аудио обрабатывается на другом потоке, и цикл с условием продолжения состоит в том, чтобы просто там препятствовать тому, чтобы основной поток завершился, в то время как аудио все еще обрабатывается.
То, что я не понимаю, то, почему select()
используется вместо sleep()
.
Из того, что я читал select()
используется для наблюдения изменений во вводе-выводе, и передача его АННУЛИРУЕТ, не делает ничего значимого. Я имею, выполнил использование кода sleep()
и это работает как ожидалось. (Мое знание низкого уровня POSIX является почти несуществующим.)
Select позволяет ждать с точностью до субсекунды и является более переносимым, чем sleep. Есть и другие способы ожидания, см. этот вопрос.
Но параметр таймаута select должен быть не float, а указателем на struct timeval. Я удивлен, что код, который вы показываете, вообще компилируется. Более того : за этим странным условным select следует безусловный sleep(1). По-моему, бессмысленно.
Использование select ()
с NULL
rfds
, wfds
и efds
является идиоматический способ портативного сна с субсекундным разрешением.
Нет никаких причин делать это. Нет причин и для Sleep(). Всегда нужно ожидать хотя бы одного события - запроса на завершение работы программы.