亲爱的多线程/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 端使用 pthread 并在信号处理程序中调用 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 的 Thinking in Java,第 4 版,p. 1194, “检查一个 打断”
最佳答案
信号处理程序所要做的就是说服函数 (callNativeCFunction()
) 返回。如果 C
有循环,请让它们检查模块变量(signaled
、shutdown
、done
或类似变量)。
如果在函数调用后,线程退出,则一切就绪。否则,函数可能应该返回一个状态,指示线程是否应该终止。
关于java - 在 C (JNI) 中结束 Java 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6090795/