Существуют потоки ядра Linux, которые время от времени выполняют некоторую работу, а затем либо переходят в спящий режим, либо блокируют семафор.Они могут находиться в этом состоянии в течение нескольких секунд - довольно много времени для потока.
Если по какой-либо причине необходимо остановить потоки, по крайней мере, если выгрузить драйвер, к которому они принадлежат, я ищу способ получить ихВне сна или вне семафора, не дожидаясь полного времени сна или не запуская семафор так часто, как это требуется.
Я нашел и прочитал много об этом, но есть несколько советов, и я до сих пор не уверен, как обстоят делаРабота.Так что, если вы могли бы пролить свет на это.
msleep_interruptible
Что может прервать это?
down_interruptible
Эта функция семафора подразумевает возможность прерывания,То же самое здесь, что может прервать этот семафор?
kthread_stop
Это описывается как устанавливает kthread_should_stop в true и пробуждает его ... , но эта функция блокируется, пока время ожидания не будетболее (даже если используется msleep_interruptible) или семафор сработал.
Что я не так понимаю?
Использовать сигнал для разблокировки - правда?
Мой поиск обнаружил, что сигнал может прерватьнить.Другие хиты говорят, что сигнал - не лучший способ работать с потоками.
Если сигнал - лучший выбор - какой сигнал я использую, чтобы разблокировать поток, но не испортить его слишком много?
SIGINTявляется сигналом завершения - я не собираюсь завершать что-либо, просто заставляю это продолжаться.
Дополнительная информация
Потоки запускают цикл, который проверяет флаг завершения, выполняет некоторую работу и затемблок во сне или семафор.Они используются для
Ситуация 1.
Сценарий производитель-потребитель, который использует семафоры для синхронизации производителя и потребителя.Они отлично работают, заставляя потоки ждать работы и запускать настройку семафора.
В настоящее время я устанавливаю флаг завершения, а затем настраиваю семафор.Это разблокирует поток, который затем проверяет флаг и завершает работу.Это не моя главная проблема.Но, конечно, я бы хотел узнать о лучшем способе.
Пример кода
while (keep_running) {
do_your_work();
down_interruptible(&mysemaphore); // Intention: break out of this
}
Ситуация 2.
Поток, который периодически регистрирует события.Этот поток спит несколько секунд между выполнением своей работы.После установки флага этот поток завершается при следующем запуске, но это может занять несколько секунд.Я хочу нарушить сон, если необходимо.
Пример кода
while (keep_running) {
do_your_work();
msleep(15000); // Intention: break out of this - msleep_interruptible?
}