Если вы используете select
, то, вероятно, вы (или ваши коллеги) внедряете значительную часть интерфейса ОС. Таким образом, это зависит от того, как вы реализуете подсистему ввода-вывода и планировщик.
Если вы не реализуете планировщик, вам нужен какой-то «центр управления», который использует примитивы синхронизации (возможно, переменные условия) для отслеживания изменений в состояниях дескрипторов файлов, которые вас интересуют.
После первоначальной проверки текущего состояния перечисленных файловых дескрипторов принципиально, как работает select
, это то, что он не возвращает до истечения времени ожидания, или один из дескрипторов, которые он заботится о состоянии изменений (таким образом, что он заботится о). Это может быть полностью обработано в планировщике, так что поток недоступен для планирования до тех пор, пока не произойдут необходимые условия, или поток не сможет заблокировать, пока не произойдет какое-либо изменение, которое может заинтересовать , проверить, действительно ли это заинтересованы, а затем либо вернитесь, если это так, либо заблокируйте снова, если это не так. В противоположность этому подходу, совершенно глупая (и неэффективная) реализация может иметь одну переменную условия, которую ожидает каждый вызывающий объект до select
, и которая передается системой ввода-вывода каждый раз, когда происходит изменение состояния (как Potatoswatter указывает, что вы также должны записать состояние).
Если вы не реализуете подсистему ввода / вывода, тогда единственный способ реализовать select
- это использовать какой-то другой, похожий на примитив, который поддерживает ваша подсистема ввода / вывода. В качестве альтернативы возьмите на себя задачу реализации ввода / вывода: оберните все в своем собственном слое и сделайте select
доступным только через этот слой. Реализация этого уровня зависит от базового API, но если все остальное терпит неудачу, вы можете создать один поток на дескриптор файла, заблокировать операции ввода-вывода в этом потоке, а затем уведомить свой «центр управления», когда файл доступен для чтения и записи. , или есть ошибки.
Сначала правильно разработайте дизайн, что, вероятно, означает изучение того, как это делают другие ОС. В противном случае вы будете тратить следующие 2 года на исправление условий гонки.