Завершение потока Java в C (JNI) - PullRequest
9 голосов
/ 23 мая 2011

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

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

Полезные темы;) Я нашел:

1 Ответ

2 голосов
/ 23 мая 2011

Все, что нужно обработчику сигнала, - это убедить функцию (callNativeCFunction()) вернуться.Если C имеет циклы, попросите их проверить переменную модуля (signaled, shutdown, done или подобное).

Если после вызова функции поток завершается, онвсе готово.В противном случае, возможно, функция должна вернуть статус, который указывает, должен ли поток завершаться или нет.

...