java - 在 C (JNI) 中结束 Java 线程

标签 java c multithreading java-native-interface kill

亲爱的多线程/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() 会更好吗(从下面的第一个链接获取的想法)?

这就是我的问题。如果有任何帮助,我将不胜感激。非常感谢。

有用的线程 ;) 我发现:

最佳答案

信号处理程序所要做的就是说服函数 (callNativeCFunction()) 返回。如果 C 有循环,请让它们检查模块变量(signaledshutdowndone 或类似变量)。

如果在函数调用后,线程退出,则一切就绪。否则,函数可能应该返回一个状态,指示线程是否应该终止。

关于java - 在 C (JNI) 中结束 Java 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6090795/

相关文章:

java - OnClick ButterKnife,没有任何反应

java - JPA OneToOne,外键在 Spring Boot 上获取 null

c - 由于内置函数的类型冲突而无法执行程序

java - 多线程和匿名类和对象

c++ - 使用Qt的并发队列是死锁的

java - 从 Java 有条件地跳过 Maven 配置文件

java - 缩放 JPanel 及其所有组件

C - 特定天数是多少小时?

c - 函数调用中的大括号在 C 中意味着什么?

java - 使用 Java 向多个线程提供数据