我们有一个Java服务器(Linux 64位)应用程序,它使用本机代码进行处理。本机代码还处理所有多线程问题,并且最近使用boost::context
进行了光纤交换。
我们现在面临的问题是AttachCurrentThread
无法用于光纤交换线程。经过一些长时间的调试和测试后,我们找到了原因:JVM似乎拒绝使用不同于其创建时给出的堆栈指针的线程。
我们通过简单地从带有修改(但有效)rsp
的pthread附加到JVM来验证这一点,当rsp
被修改时失败。
可能的修复方法会引入某种事件处理机制来将回调与光纤交换线程分离,但我真的想避免这种情况。
有人知道解决方法吗?
是否可以禁用堆栈检查(Oracle Java 1.7.0_40,64 bit)?
我们可以修改本机pthreads以指向正确的堆栈帧(我怀疑我们可以)吗? (我们不能提前设置堆栈帧。)
答案 0 :(得分:0)
免责声明:这不是一个真正的答案,因为我没有直接解决RSP交换机问题,但是发表评论的时间太长了。
根据我的经验,您应该只将原生线程附加一次,并在退出前准确分离一次。如果您不知道您是否已经附加,请使用以下代码:
jint rv = vm->GetEnv((void**)&env, JNI_VERSION_1_6);
if (rv == JNI_EDETACHED) {
vm->AttachCurrentThread((void**)&env, 0);
}
我建议首先确保在创建任何关联光纤之前准确连接到线程一次,并在它退出之前从每个本机线程中分离一次(如果本机线程没有终止,则完全不分离)。