【发布时间】:2011-05-22 21:08:23
【问题描述】:
尊敬的多线程/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 变量吗?然后我可以通过指向 JVM 的 env 指针以某种方式抛出异常以跳出 run() 吗? 或者我可以在 Java 线程上调用 interrupt(),例如在 Bruce Eckel 的书中提到(见下文)。
最后,还有一个问题: SIGSEGV 是 Posix 世界, STATUS_ACCESS_VIOLATION 是 Windows 世界。当我在 Windows 的 C 代码中尝试以下操作时:
char *s = "hello world";
*s = 'H';
我没有收到 SIGSEGV,(但我猜是 STATUS_ACCESS_VIOLATION)。由于我使用的是 signal.h,因此我只能处理非常有限的一组可用信号。你也知道我该如何处理上述情况吗?
还是在 C 端使用 pthreads 并在信号处理程序中调用 pthread_exit() 会更好(想法来自下面的第一个链接)?
那是我的问题。我将非常感谢任何帮助。非常感谢。
有用的线程;)我发现:
- Handling segfault signal SIGSEGV need to determine the cause of segfault using siginfo_t
- how to debug SIGSEGV in jvm GCTaskThread
- Bruce Eckel 在 Java 中的思考,第 4 版,p. 1194,“检查 打断”
【问题讨论】:
标签: java c multithreading java-native-interface kill