繁体   English   中英

在C(JNI)中结束Java线程

[英]Ending a Java thread in C (JNI)

亲爱的多线程/ 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端的pthreads并在信号处理程序中调用pthread_exit()(从下面的第一个链接获取的想法)?

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

有用的线索;)我发现:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM