Уважаемые гуру многопоточности / Java / C / JNI,
У меня несколько специфическая проблема. У меня есть программа Java, которая порождает потоки. В методе run () выполняется вызов C (через JNI), где сначала локальные переменные потока выделяются в TLS, а затем вводится event_loop (так что время жизни потока по умолчанию определяется этим циклом) .
Моя проблема теперь заключается в том, как завершить работу / убить поток, если произойдет что-то вроде SIGSEGV. Было бы важно, чтобы весь процесс и другие потоки в нем могли продолжаться. Вот почему мы разделили потоки с помощью TLS.
(Я знаю, некоторые люди не одобряют этого, и, конечно, правильно заниматься защитным программированием, стараясь заранее избежать таких сбоев. Этот код предназначен для периода миграции только, поскольку мы переходим с C на Java. Но это займет некоторое время из-за небольшого количества ресурсов, которые у нас есть.)
class MyThread extends Thread {
run() {
//wrapping the following with try-catch and throwing exception in signal
//handler on C side possible?
callNativeCFunction(); //allocates TLS, enters event_loop()
}
}
Если бы я использовал signal.h, был бы мой обработчик сигнала вызываться в контексте потока? Получу ли я доступ к переменным TLS? Могу ли я каким-то образом через указатель env на JVM выдать исключение, чтобы выйти из run ()? поскольку мы переходим с C на Java. Но это займет некоторое время из-за того, что у нас мало ресурсов.)
class MyThread extends Thread {
run() {
//wrapping the following with try-catch and throwing exception in signal
//handler on C side possible?
callNativeCFunction(); //allocates TLS, enters event_loop()
}
}
Если бы я использовал signal.h, мог бы мой обработчик сигнала вызываться в контексте потока? Получу ли я доступ к переменным TLS? Могу ли я каким-то образом через указатель env на JVM выдать исключение, чтобы выйти из run ()? поскольку мы переходим с C на Java. Но это займет некоторое время из-за того, что у нас мало ресурсов.)
class MyThread extends Thread {
run() {
//wrapping the following with try-catch and throwing exception in signal
//handler on C side possible?
callNativeCFunction(); //allocates TLS, enters event_loop()
}
}
Если бы я использовал signal.h, мог бы мой обработчик сигнала вызываться в контексте потока? Получу ли я доступ к переменным TLS? Могу ли я каким-то образом через указатель env на JVM выдать исключение, чтобы выйти из run ()? Или я мог бы вызвать interrupt () в потоке Java, как, например, упомянуто в книге Брюса Эккеля (см. Ниже).
Наконец, еще один вопрос: SIGSEGV - это мир Posix, STATUS_ACCESS_VIOLATION - мир Windows. Когда я попробовал следующее в коде C в Windows:
char *s = "hello world";
*s = 'H';
Я не получаю SIGSEGV (но, наверное, STATUS_ACCESS_VIOLATION). Поскольку я использую signal.h, я могу обработать лишь очень ограниченный набор сигналов. Вы знаете, как я мог бы справиться и с вышеуказанным случаем?
Или мне было бы лучше с pthreads на стороне C и вызовом pthread_exit () в обработчике сигнала (идея взята из первой ссылки ниже)?
Это были мои вопросы. Буду очень благодарен за любую помощь. Заранее большое спасибо.
Полезные темы;) Я обнаружил: