1

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

在我的 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);
}
4

1 回答 1

1

在崩溃的情况下:

func在 for 循环内创建。然后你使用func. 在你的 for 循环结束时,functhread被销毁。谁知道当你触发一个线程并在线程想要访问它时销毁它的函子时会发生什么。

您还将从另一个本机线程回调您的 java 代码,而不是调用 java 代码,这听起来是一件非常不安全的事情

于 2010-02-16T10:07:37.117 回答