Как заблокировать, пока не будут готовы все файловые дескрипторы? Использовать select()/poll()/epoll()?

Я нахожусь в ситуации, когда я хотел бы, чтобы программа C блокировала набор файловых дескрипторов, пока все файлы не будут готовы. Это отличается от традиционных системных вызовов select(), poll() и epoll(), которые блокируются только до тех пор, пока не будет готов какой-либо файловый дескриптор. Есть ли стандартная функция, которая будет блокироваться, пока все файлы не будут готовы? Или, может быть, есть какие-то другие хитрые трюки?

Очевидно, я мог бы вызвать select() в цикле, пока все файловые дескрипторы не будут готовы, но я не хочу нести накладные расходы на переключение контекста, вытеснение, миграцию и т. д. Я бы предпочел, чтобы select() задача просто спать, пока все файлы не будут готовы.


person Glenn    schedule 16.06.2013    source источник


Ответы (1)


Это не потокобезопасно, если другие потоки одновременно работают с одними и теми же файловыми дескрипторами (но вам, вероятно, не следует этого делать), но вы можете попробовать это:

  1. Инициализируйте набор опросов для всех интересующих вас файловых дескрипторов.
  2. poll() для текущего набора файловых дескрипторов
  3. Когда poll() вернется, просканируйте revents и найдите все готовые файловые дескрипторы. Удалите их из набора опросов.
  4. Если в наборе еще остались файловые дескрипторы, вернитесь к шагу 2.
  5. poll в последний раз с полным набором файловых дескрипторов, чтобы убедиться, что они все еще готовы.
  6. Если некоторые из них больше не готовы, вернитесь к шагу 1.
  7. успех

Это все еще может включать много вызовов poll(), но, по крайней мере, это не ожидание занятости. Я не думаю, что существует более эффективный способ.

person Celada    schedule 17.06.2013
comment
Да, это то, что я имел в виду под циклом. Я рассматривал возможность расширения ядра Linux, чтобы делать то, что мне нужно, но это кажется нетривиальным объемом усилий, поскольку потоки записи файлов должны выполнить некоторую работу, чтобы определить, следует ли разбудить поток. - person Glenn; 18.06.2013