> Решение:
> while (1) {
> if ( <событие> ) {
> <обработка>
> }
> }
> Проблема: много холостых ходов цикла, загрузка процессора до 100% Решение не совсем правильное. (Я, кстати, очень сильно удивлюсь если в Виндовсе при использовании Sleep() загрузка процессора будет не 100%).
Правильно - использовать select() (man 2 select) или poll() (man 2 poll), что-то типа
while (select(...)) {
// event happened. Process it:
...
}
при этом внутри цикла нет ветки else со sleep() - select() сам ждет события, и поскольку он реализован через системный вызов, кернел знает что данный поток будет не активным пока не произойдет событие заданное параметрами select()'а, и может наиболее эффективно распорядится ресурсами системы - например, поток не будет активизирован просто чтобы убедится что событие еще не наступило и сказать sleep() в очередной раз.
select()/poll() работают ожидая события ввода/вывода на файловых дескрипторах (наличия данных для чтения, готовности к записи, возникновения ошибки), но это на самом деле не является существенным ограничением:
а) если событие которого вы ждете это событие ввода/вывода на файловом дескрипторе к которому вы имеете доступ, оно прямо транслируется в параметеры select()/poll();
б) если это какое-то иное событие, значит где-то в системе есть поток который висит на вызове функции, завершение которой и будет сигналом этого события (напр. ожидание завершения вызова функции интерфейса какой-то базы данных, или ожидание ответа от пользователя в потоке графического интерфейса, и т.д). В этом случае довольно легко организовать пару файловых дескрипторов (напр. функцией pipe() (man pipe)); поток который ожидает события в цикле while(select()) на самом деле ожидает наличия данных на выходном конце pipe'а, а поток который дождался завершения вызова функции, поставляет эти данные - пишет, например, всего 1 байт во входной конец pipe'а, после чего select() в другом потоке завершается и тело цикла while выполняется.
А кстати, man sched_yield чтобы почитать о функции которая отдает квант выделеный текущему потоку, хотя по-моему это не то что тут требуется.