#c #linux #kernel
#c #linux #ядро
Вопрос:
Существуют потоки ядра Linux, которые время от времени выполняют некоторую работу, а затем либо переходят в спящий режим, либо блокируют семафор. Они могут находиться в этом состоянии в течение нескольких секунд — довольно долгое время для потока.
Если потоки по какой-либо причине необходимо остановить, по крайней мере, при выгрузке драйвера, которому они принадлежат, я ищу способ вывести их из режима ожидания или из семафора без ожидания всего времени ожидания или запуска семафора так часто, как требуется.
Я нашел и много читал об этом, но есть несколько советов, и я все еще не уверен, как все работает. Итак, если бы вы могли пролить некоторый свет на это.
msleep_interruptible
Что может это прервать?
down_interruptible
Эта функция семафора подразумевает возможность прерывания. То же самое здесь, что может прервать этот семафор?
kthread_stop
Это описано как присваивает kthread_should_stop значение true и запускает его… но эта функция блокируется до тех пор, пока не закончится время ожидания (даже при использовании msleep_interruptible) или не будет запущен семафор.
Что я неправильно понимаю?
Использовать сигнал для разблокировки — действительно?
Мой поиск обнаружил, что сигнал может прервать поток. Другие обращения говорят, что сигнал — не лучший способ работать с потоками.
Если сигнал является лучшим выбором — какой сигнал мне использовать, чтобы разблокировать поток, но не слишком сильно его испортить?
SIGINT — это сигнал завершения — я не собираюсь что-то завершать, просто продолжайте.
Дополнительная информация
Потоки запускают цикл, который проверяет флаг завершения, выполняет некоторую работу, а затем блокируется в режиме ожидания или семафоре. Они используются для
Ситуация 1.
Сценарий производителя-потребителя, который использует семафоры для синхронизации производителя и потребителя. Они отлично работают, чтобы заставить потоки ждать работы и начать запуск при настройке семафора.
В настоящее время я устанавливаю флаг завершения, затем настраиваю семафор. Это разблокирует поток, который затем проверяет флаг и завершается. Это не моя главная проблема. Однако, конечно, я хотел бы узнать о лучшем способе.
Пример кода
while (keep_running) {
do_your_work();
down_interruptible(amp;mysemaphore); // Intention: break out of this
}
Ситуация 2.
Поток, который периодически регистрирует данные. Этот поток спит несколько секунд между выполнением своей работы. После установки флага этот поток завершается при следующем запуске, но это может занять несколько секунд. Я хочу прервать режим ожидания, если это необходимо.
Пример кода
while (keep_running) {
do_your_work();
msleep(15000); // Intention: break out of this - msleep_interruptible?
}
Комментарии:
1. Пожалуйста, предоставьте более подробную информацию о вашей задаче . Лучше включить несколько примеров кода, который демонстрирует ваше намерение. Вы спрашиваете о прерываниях и их способности прерывать состояние ожидания определенного объекта синхронизации. Но основное назначение прерываний — пробудить поток от любого такого объекта синхронизации. Если вы знаете, какой объект синхронизации ожидает потоки, лучше пробудить поток, используя операции с этим объектом синхронизации, а не прерывания. Чувствуется, что у вас проблема XY , поэтому лучше описать исходную
2. Я добавил больше информации о том, как я использую потоки. Вы правы, чего мне не хватает, так это правильного способа разблокировать состояния ожидания потоков. Я просто не знаю, как именно. Слово прерывание не означает программное прерывание или что-то в этомроде. Я использовал его в контексте функции msleep_interruptible, которая предполагает, что ее можно каким-то образом прервать = остановить. Приведены примеры кода, хотя они действительно просты,
3. Показывать код приятно, но проблема все еще не ясна. Поток ожидает (например) семафора для определенной цели. Почему вы хотите его активировать? Вы хотите, чтобы поток перешел в следующий цикл ? Если это так, освободите семафор — это именно то, чего ожидает поток. Или вы хотите завершить поток (предварительно установив
keep_running
переменной значение FALSE)?4. @Tsyvarev упс … Похоже, это было потеряно при составлении моего вопроса. Я хочу разблокировать потоки, чтобы завершить их. Это означает, что разблокируйте их прямо сейчас, независимо от семафоров или времени ожидания.