0
我正在将JVM嵌入到具有4个永不死亡的工作线程的Web服务器中。下面的代码在4个中的一个的任何工人内每个HTTP请求运行:多线程JNI导致负载下的段错误
// normally I would do URL routing here first, but this is just a JNI test now
jclass cls;
jmethodID method;
jobjectArray args;
jclass stringClass;
jstring jstr;
(*jvm)->AttachCurrentThread (jvm, &env, NULL);
cls = (*env)->FindClass(env, "HelloWorldClass");
method = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
jstr = (*env)->NewStringUTF(env, "Hello world!");
stringClass = (*env)->FindClass(env, "java/lang/String");
args = (*env)->NewObjectArray(env, 1, stringClass, jstr);
(*env)->CallStaticVoidMethod(env, cls, method, args);
当我与调试器步,它的工作原理。但是当我在weighttp基准测试中加入一些负载时,它在FindClass()
行或CallSTaticVoidMethod()
行上随机分段错误。可能是什么问题呢?我通读了很多文档,我没有看到我需要在这里锁定或释放任何东西。
这几乎是最基本的JNI代码是可能的,从官方文档结转:http://java.sun.com/docs/books/jni/html/invoke.html
当然,使它成为全球性问题。每个线程都需要自己的价值。如果它是全球性的,他们可以使用彼此的价值观。 – EJP
啊对,因为整个过程中全局变量只存在一次。我有一个脑冻结,告诉我每个线程都有自己的副本。 – Blub