jun*_*per 9 c java java-native-interface multithreading 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()
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用signal.h,我的信号处理程序是否会在线程上下文中调用?我可以访问TLS变量吗?我可以通过env指针以某种方式通过JVM抛出一个异常来打破run()吗?或者我可以在Java线程上调用interrupt(),例如在Bruce Eckel的书中提到的(见下文).
最后,还有一个问题:SIGSEGV是Posix世界,STATUS_ACCESS_VIOLATION是Windows世界.当我在Windows中的C代码中尝试以下内容时:
char *s = "hello world";
*s = 'H';
Run Code Online (Sandbox Code Playgroud)
我没有得到SIGSEGV,(但我猜是STATUS_ACCESS_VIOLATION).由于我使用的是signal.h,因此我只能处理一组非常有限的信号.你知道我怎么能处理上述情况吗?
或者我会更好地使用C端的pthreads并在信号处理程序中调用pthread_exit()(从下面的第一个链接获取的想法)?
那是我的问题.我会非常感谢任何帮助.提前谢谢了.
有用的线索;)我发现:
信号处理程序所要做的就是说服函数 ( callNativeCFunction()
) 返回。如果C
有循环,请让它们检查模块变量(signaled
、shutdown
、done
或类似变量)。
如果在调用该函数之后,线程退出,则一切都已设置。否则,函数可能应该返回一个状态,指示线程是否应该终止。
归档时间: |
|
查看次数: |
1309 次 |
最近记录: |