Сбой Tomcat, если сделать многопоточный нативный вызов с использованием Jace JNI - PullRequest
1 голос
/ 16 февраля 2010

Я использую Netbeans для создания веб-проекта Java (на основе Tomcat 6.02), который загружает родную dll c ++. Я использую библиотеку 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;
    }
}

EDIT:

Странно, следующий код также работает. То есть, если я вызову функтор один раз, а затем создаю несколько потоков, сбоев не будет. Также этот сбой происходит только в Tomcat, а не в том случае, если я создаю отдельное Java-приложение. Кто-нибудь может объяснить, почему это происходит?

MyFunctor func1;
func1();

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

1 Ответ

1 голос
/ 16 февраля 2010

В случае сбоя:

Вы создаете func внутри цикла for. Затем вы начинаете тему, используя func. В конце цикла for, func и thread будут уничтожены. Кто знает, что произойдет, если вы запустите поток и уничтожите его функтор именно тогда, когда поток захочет получить к нему доступ.

Вы также перезвоните в свой Java-код из другого собственного потока, чем тот, в котором вы вызывали Java-код, что звучит как очень небезопасная вещь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...