Я читаю «Драйверы устройств Linux 3-е издание», главу о параллелизме и условиях гонки. Есть пример, который я не совсем понимаю; они говорят об общем паттерне в программировании ядра, когда нужно инициировать действие (например, новый поток ядра или пользовательский процесс, запрос существующего процесса или аппаратное действие) вне текущего потока, дождаться, пока это действие полный. Пример не очень эффективного решения:
struct semaphore sem;
init_MUTEX_LOCKED(&sem);
start_external_task(&sem);
down(&sem);
Затем они предлагают вызвать внешнюю задачу (& sem), когда ее работа завершена.
Я не понимаю, почему мы не можем сделать это так:
struct semaphore sem;
down(&sem);
start_external_task(&sem);
Почему необходимо создать мьютекс в заблокированном состоянии, а затем получить мьютекс после запуска задачи?
С нетерпением жду ответа от вас! Спасибо.