上下文切换本地线程无法连接到JVM

我们有一个Java服务器(Linux 64位)的应用程序,它使用本机代码处理的东西。 本地代码也处理所有的multithreading问题,最近使用boost::context进行光纤交换时得到了增强。

我们现在面临的问题是, AttachCurrentThread失败,光纤交换线程。 经过一些长时间的debugging和testing后,我们find了这样的原因:JVM似乎拒绝了不同于指定的栈指针的线程。

我们通过简单地从带有修改的(但是有效的) rsp的pthread连接到JVM来validation这一点,当rsp被修改时rsp失败。

一个可能的解决scheme会引入某种事件处理机制来解耦来自光纤交换线程的callback,但我真的想避免这种情况。

有没有人知道这个解决方法?

是否可以禁用堆栈检查(Oracle Java 1.7.0_40,64位)?

我们可以修改本地pthreads指向正确的堆栈帧(我怀疑我们可以)? (我们不能提前设置堆栈帧)。

免责声明:这不是一个真正的答案,因为我没有直接解决RSP交换问题,但是发表评论太长了。

根据我的经验,您应该只附加一次本地线程,并在退出之前分离一次。 如果您不知道是否已经附加,请使用以下代码:

 jint rv = vm->GetEnv((void**)&env, JNI_VERSION_1_6); if (rv == JNI_EDETACHED) { vm->AttachCurrentThread((void**)&env, 0); } 

我建议首先确保在创建任何关联的光纤之前,只将其附加到线程一次,并且在退出之前从每个本地线程中分离一次(如果本地线程没有终止,则根本不分离)。