1

Netbeans を使用して、c++ ネイティブ dll をロードする Java Web プロジェクト (Tomcat 6.02 ベース) を構築しています。JaceJNIをラップするライブラリを使用しています。

私の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;
    }
}

編集:

奇妙なことに、次のコードも機能します。つまり、ファンクターを 1 回呼び出してから複数のスレッドを作成しても、クラッシュは発生しません。また、このクラッシュは Tomcat でのみ発生し、スタンドアロンの Java アプリケーションを作成した場合には発生しません。なぜこれが起こるのか誰か説明してもらえますか?

MyFunctor func1;
func1();

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

1 に答える 1

1

クラッシュした場合:

funcfor ループ内で作成します。次に、を使用してスレッドを開始しますfunc。for ループの最後で、func破棄threadされます。スレッドを起動し、スレッドがアクセスしたいときにそのファンクターを破棄するとどうなるかは誰にもわかりません。

また、Java コードを呼び出したスレッドとは別のネイティブ スレッドから Java コードにコールバックすることになりますが、これは非常に危険なことのように思えます。

于 2010-02-16T10:07:37.117 に答える