2010-02-16 11 views
1

J'utilise NetBeans pour construire un projet web java (basé sur tomcat 6.02) qui charge une DLL native C++. J'utilise la bibliothèque Jace qui enveloppe JNI.Tomcat se bloque si effectuer un appel natif multithread en utilisant Jace JNI

Dans mon code java, j'ai une fonction de rappel statique que j'appelle du code C++. J'essaye d'invoquer ce callback dans un nouveau thread en utilisant boost.Thread mais tomcat meurt juste sans message ou rapport d'erreur quand je le fais. Cependant, si j'appelle directement la fonction, cela fonctionne très bien.

Pouvez-vous suggérer ce qui pourrait ne pas être?

ci-dessous est mon C++ code qui provoque l'accident:

//from native method: 


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

ci-dessous est mon C++ code qui fonctionne très bien:

//from native method: 


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

classe Functor (ce qui provoque l'accident):

class MyFunctor 
{ 
public: 

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

est mon code java:

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

EDIT:

Étrangement, le code suivant fonctionne également. C'est-à-dire que si j'appelle le foncteur une seule fois puis que je crée plusieurs threads, il n'y a pas de plantage. Aussi cet accident se produit uniquement dans Tomcat et pas si je fais une application Java autonome. Quelqu'un peut-il expliquer pourquoi cela arrive?

MyFunctor func1; 
func1(); 

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

retagged pour stimuler-fil pour être compatible avec d'autres boost bibliothèques. – rcollyer

Répondre

1

Dans le cas que les accidents:

Vous créez func l'intérieur de la boucle. Ensuite, vous démarrez un fil en utilisant func. À la fin de votre boucle for, func et thread seront détruits. Qui sait ce qui va se passer quand vous lancez un fil et détruisez son foncteur juste quand le fil veut y accéder.

Vous aurez également rappellerez à votre code java d'un autre thread natif que ce que vous invoquez le code java dans, qui sonne comme une chose très dangereuse à faire

+0

S'il vous plaît regarder ma question mise à jour. –

+0

On dirait que vous avez de la chance et le deuxième cas ne plante pas. Juste parce que ça ne plante pas ne veut pas dire que c'est juste. – nos