Подтвердить что ты не робот

Зачем использовать select() вместо sleep()?

Я работаю над главой об iPhone-аудио и столкнулся с разделом кода, который я не могу понять:

while (aqc.playPtr < aqc.sampleLen) 
{
    select(NULL, NULL, NULL, NULL, 1.0);
}

(Полный пример кода находится на страницах 163-166). Из того, что я понимаю в коде, аудио обрабатывается в другом потоке, и цикл while находится там, чтобы предотвратить прерывание основного потока, пока звук все еще обрабатывается.

Я не понимаю, почему select() используется вместо sleep().

Из того, что я прочитал, select() используется для контроля изменений ввода-вывода и передачи его. NULL не делает ничего значимого. Я запустил код с помощью sleep(), и он работает так, как ожидалось. (Мои знания о низком уровне POSIX почти несуществуют.)

4b9b3361

Ответ 1

Выберите разрешить точное подсевое ожидание и более переносимое, чем сон. Есть и другие способы подождать, посмотри этот вопрос.

Но параметр тайм-аута select не должен быть float, а указателем на struct timeval. Я удивлен кодом, который вы показываете, даже компилируется. Дополнительно: этот странный условный выбор сопровождается безусловным сном (1). Мне кажется бессмысленным.

Ответ 2

Использование select() с NULL rfds, wfds и efds - это идиоматический способ портативного спящего режима с разрешающим разрешением.

Ответ 3

Ну, сон (3) может быть реализован с использованием сигналов. Это зависит от платформы.

Когда вы используете select (2) и poll (2), вы знаете, что никакие сигналы не будут задействованы, что часто очень полезно. Например, если вы используете будильник (2), вы также не должны использовать сон (3), потому что "смешивание вызовов с тревогами и сном - плохая идея" (согласно странице руководства).

Кроме того, выбор и опрос дают вам миллисекундную детализацию во время сна, но сон имеет только зернистость в секундах.

Ответ 4

Когда вы используете сигнал SIGALM в своем приложении и используете функции (u)sleep, когда SIGALRM появляется программа, немедленно возвращайтесь из функции ожидания, поэтому лучший способ спящего - ждать функции select.

struct timeval tv;

tv.tv_sec = 1;
tv.tv_usec = 1000;

do
{
  ret = select(1, NULL, NULL, NULL, &tv);
}
while((ret == -1)&&(errno == EINTR)); //select is interruped too

Ответ 5

Реальная причина использования "выбора" вместо "сна" - точность сна, особенно при воспроизведении аудио или видео. Использование "select" позволяет получить более точный интервал времени для сна в linux или windows или другой ОС, чем в "sleep".

Я удивлен, что многие люди на самом деле не знают почему. И, пожалуйста, перестаньте стыдить программиста/писать такой код.

Ответ 6

Нет причин для этого. Там нет причин спать(). Всегда следует ожидать, по крайней мере, одного запроса завершения программы - программы.