如果使用Jace JNI进行多线程本机调用,Tomcat会崩溃

时间:2010-02-16 09:45:30

标签: java tomcat java-native-interface boost-thread

我正在使用Netbeans构建一个java web项目(基于tomcat 6.02),它加载一个c ++本机dll。我正在使用包裹JNI的Jace库。

在我的java代码中,我有一个静态回调函数,我从c ++代码调用它。我试图在使用boost.Thread的新线程中调用此回调,但是当我这样做时,tomcat就会在没有任何消息或崩溃报告的情况下死掉。但是,如果我直接调用该函数,它可以正常工作。

你能否说一下可能出错的地方?

下面的

是我导致崩溃的c ++代码:

//from native method:


for (int i = 0; i < 10; ++i)
{
    MyFunctor func;
    boost::thread t(func);
}
下面的

是我的c ++代码可以正常工作:

//from native method:


for (int i = 0; i < 10; ++i)
{
    MyFunctor func;
    func();
}

Functor类(导致崩溃):

class MyFunctor
{
public:

    void operator ()() const
    {
        ArrayList orders, trades;
        //...Fill the above ArrayLists;
        jace::proxy::test::CallBackTest::callbackFunc(orders, trades);
    }
}

以下是我的java代码:

public class CallBackTest {
    public static void callbackFunc(ArrayList arraylist, ArrayList arraylist1) {
        //System.out.println(); the two arraylists;
    }
}

编辑:

奇怪的是,以下代码也有效。也就是说,如果我一次调用仿函数然后创建多个线程,就不会发生崩溃。此崩溃只发生在Tomcat中,而不是如果我创建一个独立的Java应用程序。任何人都可以解释为什么会这样吗?

MyFunctor func1;
func1();

for (int i = 0; i < 10; ++i)
{
    MyFunctor func;
    boost::thread t(func);
}

1 个答案:

答案 0 :(得分:1)

在崩溃的情况下:

您在for循环中创建func。然后使用func启动一个线程。 在for循环结束时,functhread将被销毁。谁知道当你发起线程并在线程想要访问它时销毁它的仿函数时会发生什么。

你还会从另一个本地线程回调你的java代码,而不是你调用java代码,这听起来像是一个非常不安全的事情