потоки и вызов callback функций
От: Аноним  
Дата: 11.08.11 20:28
Оценка:
Привет!
есть прога на перле))) — не смеяться и не переводить тему в другой форум))
дело ща пойдет о С++ только.

В этой проге понадобился функционал из некой С++'ой библиотеки.
Через swig обертку достучались до нужной функции на С++.
Сразу скажу, что весь функционал в ней написан с использованием многопоточности.
Т.е. вызываемый код в обертке на самом деле выполнялся в новеньком, стартуемом
тока для этих целей при вызове, pthread'e. Но потом оказалось, что из этого кода
надо дернуть код, который есть тока на перле. И результаты его, собственно, тока
перлу и нужны. Типа callback реализовать. Написали. Вроде))) Через указатель на
boost-функцию. В перле создается через new новый func-ptr, инициализируется
указателем на sub {} в перле. Через set_func_ptr через swig передается в С++ код.
Там запоминается в переменной, принадлежащей unnamed namespace.
В коде С++ в нужный момент для указателя задаются аргументы, и инициализируется вызов.
Это по идее. Уже на этапе "задать аргументы" громко "падает" перловая прога.
Переместили код из С++ части, той, что в новом потоке типа выполнялась, в SWIG
код, он же тоже сишный. Все заработало...
Мелькнула мысль — что работает — потому что теперь код выполняется в том же потоке,
что и основной перловый код — вызов оSWIG'ованной функции явно происходит в контексте
именно этого потока. А вот как тока мы код перемещаем в другой — сишный поток, тут все
и наворачивается. НО! все равно не понятно почему? Ведь перл — в основе тот же С имеет.
Вроде и потоки там так же создаются, что и в "чисто" С++ потоке.
Но что за нафик? Как побороть? Код вызова callback функции то должен выполняться
только в "чисто" С++ потоке, а не в оSWIG'ованной функции.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.