gpt4 book ai didi

java - 上下文切换的 native 线程无法附加到 JVM

转载 作者:IT王子 更新时间:2023-10-29 00:43:59 25 4
gpt4 key购买 nike

我们有一个 Java 服务器(Linux 64 位)应用程序,它使用 native 代码来处理它的内容。 native 代码还处理所有多线程问题,并且最近通过使用 boost::context 的光纤切换得到了 boost 。

我们现在面临的问题是 AttachCurrentThread 对于光纤交换线程失败。经过长时间的调试和测试后,我们找到了原因:JVM 似乎拒绝使用与创建时给定的堆栈指针不同的线程。

我们通过简单地从具有修改的(但有效的)rsp 的 pthread 附加到 JVM 来验证这一点,当 rsp 被修改时失败。

一个可能的修复方法是引入某种事件处理机制来将回调与光纤交换线程分离,但我真的很想避免这种情况。

有人知道解决这个问题的方法吗?

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

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

最佳答案

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

根据我的经验,您应该恰好附加一次 native 线程,并在它退出之前恰好分离一次。如果您不知道自己是否已经附加,请使用此代码:

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

我首先建议,确保在创建任何关联的纤程之前恰好附加到线程一次,并在每个 native 线程退出之前恰好分离一次(或者根本不分离,如果 native 线程没有终止)。

关于java - 上下文切换的 native 线程无法附加到 JVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19092602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com