Завершение потока Java в C (JNI)

Уважаемые гуру многопоточности / 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 () в обработчике сигнала (идея взята из первой ссылки ниже)?

Это были мои вопросы. Буду очень благодарен за любую помощь. Заранее большое спасибо.

Полезные темы;) Я обнаружил:

9
задан Community 23 May 2017 в 12:26
поделиться