Такой языко-агностичный вопрос:
Нужно запустить некий кусок вычислений в параллель (создать поток для него) и убить этот кусок вычислений через N_EXEC_TIMEOUT секунд. Но убить «грациозно», отправив некий сигнал потоку, выполняющему вычисления.
Вопрос в том, что поток не может обрабатывать сигнал (ALRM, например) монопольно, ведь таких кусков вычислений в один и тот же момент времени может быть сколько угодно.
Правильно ли я понимаю, что pthread_kill каким-то чудесным образом решает эту проблему (корень которой в том, что обработчики сигналов ставятся на уровне процесса, а на уровне потока можно только замаскировать получение сигналов)?
Есть ли в реалтаймовых расширениях для ядра Linux некий механизм, позволяющий ограничивать время работы потока? Что-то вроде «суммарное время исполнения кода этого потока не может превышать 500 ms, если больше - сначала запусти предопределённый soft-обработчик, определённый в коде потока, а если нет такого или после запуска soft-обработчика поток добрался до верхней hard-границы времени исполнения, то просто освободить все ресурсы потока и убить его»?
В итоге это всё нужно для того, чтобы можно было делать что-то вроде:
# async, "green" thread
spawn do
# 2 pthreads will be created:
# 1-st is a watchdog thread to break our calculations on timeout
# 2-nd - for calculations itself
# 1-st is watching for 2-nd thread status. It will terminate if 2-nd thread exited OR timeout occured
# our async/"green" thread will yield/block while joining the 2-nd thread
result = with_timeout do
... some code ...
end
rescue Exception::Timeout
puts "Timeout occured"
end