Для проекта класса, включающего планирование процессов с использованием блокировок и блокировок, мы должны использовать две функции ядра:
int wait_event_interruptible(wait_queue_head_t q, CONDITION);
void wake_up_all(wait_queue_head_t *q);
Объяснение wait_event_interruptible:
Блокирует текущую задачу в очереди ожидания, пока СОСТОЯНИЕ не станет истинным.
Это на самом деле макрос. Он многократно оценивает СОСТОЯНИЕ, которое является фрагментом кода C, такого как foo == bar или function ()> 3. Как только условие выполнено, wait_event_interruptible возвращает 0. Если условие ложно, текущая задача добавляется в wait_queue_head_t список с состоянием TASK_INTERRUPTIBLE; текущий процесс будет блокироваться до тех пор, пока не будет вызван wake_up_all (& q), затем он повторно проверит СОСТОЯНИЕ. Если текущая задача получает сигнал до того, как условие становится истинным, макрос возвращает -ERESTARTSYS.
И объяснение wake_up_all:
Разбудить все задачи в очереди ожидания, установив их состояния в TASK_RUNNABLE.
Мне трудно понять, как именно работают эти функции и как их использовать вместе. Например, когда проверяется СОСТОЯНИЕ? Ожидает ли непрерывный опрос wait_event_interruptible или перепроверяет условие только при вызове wake_up_all? Это объяснение немного неясно.
Если бы вы могли привести пример совместного использования этих функций, это было бы очень полезно.