在C(JNI)中结束Java线程

时间:2011-05-22 21:08:23

标签: 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变量吗?我可以通过env指针以某种方式通过JVM抛出一个异常来打破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()(从下面的第一个链接获取的想法)?

那是我的问题。我会非常感谢任何帮助。非常感谢提前。

有用的线索;)我发现:

1 个答案:

答案 0 :(得分:2)

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

如果在调用函数后,线程退出,则全部设置。否则,函数可能会返回一个状态,指示线程是否应该终止。