亲爱的多线程/ 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()(从下面的第一个链接获取的想法)?
那是我的问题。我会非常感谢任何帮助。非常感谢提前。
有用的线索;)我发现:
答案 0 :(得分:2)
所有信号处理程序必须做的是说服函数(callNativeCFunction()
)返回。如果C
有循环,请让他们检查模块变量(signaled
,shutdown
,done
或类似变量。
如果在调用函数后,线程退出,则全部设置。否则,函数可能会返回一个状态,指示线程是否应该终止。