亲爱的多线程/ 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()(从下面的第一个链接获取的想法)?
那是我的问题.我会非常感谢任何帮助.提前谢谢了.
有用的线索;)我发现:
我目前正在使用Hibernate处理应用程序,我们希望能够即时插入列和表,即在运行时,并继续使用应用程序而无需重新启动它.我们目前正在构建实体,但尚未使用它们.我们有旧的C代码(有一天要迁移到Java),它托管我们的业务逻辑,并通过JNI调用Java/Hibernate来从数据库中获取记录.在阅读了几个线程(参见下面的链接)和hibernate 3.6参考后,我仍然有一些问题:
1.如果我在我的应用程序中嵌入SchemaUpdate,如下所述:http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/toolsetguide.html#toolsetguide-s1-6我 是否那么必须重新创建SessionFactory(这是一个昂贵的操作),即使我不使用实体(目前的情况;但在将来,这将改变)?然后,旧会话将无效,即我必须将已经在内存中并由会话维护的实体迁移到新会话?这有可能吗?Hibernate是否为有关schemata的实体维护ORM之外的信息?如此提议的那样(会话,即第一级)缓存失效是不够的: 在hibernate运行时更改模式
2.如何改变列?我想这仍然是@Bozho写的:"唉,hibernate不能改变列."? Hibernate更新表模式
到目前为止,这是我的问题,谢谢你的帮助.
我读过的更多参考资料:
我试图写它接受一个字符串作为一个对位计和抛出异常的方法的单元测试,如果它是畸形的(并且没有,如果它是好的).我想写一个参数化测试在几个字符串和期望的异常,其中饲料(包括是否良好形成的输入字符串没有抛出如此!).如果尝试使用@Test(expect = SomeException.class)注释,我遇到了两个问题:
expect = null是不允许的.那么我怎样才能测试抛出NO异常的预期结果(对于结构良好的输入字符串)?
期待=不可能?我还没有尝试过,但我强烈怀疑,这样的话看完这个(请你说明这是否是真的?): http://tech.groups.yahoo.com/group/junit/message/19383 这那么似乎是我发现的最佳解决方案.您如何看待它,特别是与此相比: 如何在参数化测试中测试异常?
提前感谢您的任何帮助,我期待着讨论:)