2013-10-03 4 views
2

Я столкнулся с сбоем при попытке создать один интерпретатор tcl в потоке. Я использую TCL версии 8.5.9 для linux rh6. Сбой при различных функциях каждый раз кажется своего рода повреждением памяти. Пройдя через сеть, это кажется правильным подходом. Кто-нибудь сталкивался с подобной проблемой? Многопоточное использование Tcl требует какой-либо специальной поддержки?Использование Tcl в многопоточном приложении C++

Ниже приведена небольшая программа, вызывающая сбой при tcl версии 8.5.9.

#include <tcl.h> 
#include <pthread.h> 

void* run (void*) 
{ 
     Tcl_Interp *interp = Tcl_CreateInterp(); 
     sleep(1); 
     Tcl_DeleteInterp(interp); 
} 

main() 
{ 
     pthread_t t1, t2; 

     pthread_create(&t1, NULL, run, NULL); 
     pthread_create(&t2, NULL, run, NULL); 

     pthread_join (t1, NULL); 
     pthread_join (t2, NULL); 
} 
+1

Прежде всего, вы должны вызывать ['Tcl_FindExecutable'] (http://www.tcl.tk/man/tcl8.6/TclLib/FindExec.htm). –

+0

Не по нити, а один раз за процесс. Он настраивает многие вещи. –

+0

как вы его компилируете? Передача -ltcl8.5 аргумент ?? Включен ли поток файлов libtcl8.5.so? –

ответ

1

Стандартная библиотека Tcl по умолчанию не включена. (ну, не с 8.5.9 afaik, 8.6 is).

Итак, вы проверили, что ваш tcl lib был создан поток включен?

Если у вас есть tclsh встроенных против Lib, вы можете просто запустить:

% parray ::tcl_platform 
::tcl_platform(byteOrder)  = littleEndian 
::tcl_platform(machine)  = intel 
::tcl_platform(os)   = Windows NT 
::tcl_platform(osVersion)  = 6.2 
::tcl_platform(pathSeparator) = ; 
::tcl_platform(platform)  = windows 
::tcl_platform(pointerSize) = 4 
::tcl_platform(threaded)  = 1 
::tcl_platform(wordSize)  = 4 

Если ::tcl_platform(threaded) является 0, ваша сборка не включена резьбы. Вам нужно будет создать версию с поддержкой потоков, передав --enable-threads скрипту configure.

Использовали ли вы правильные определения, чтобы объявить, хотите ли вы, чтобы потоки разрешали макросы из tcl.h? Вы должны добавить -DTCL_THREADS к вызову вашего компилятора, иначе макросы блокировки будут скомпилированы как no-ops.

+0

Я запустил эту команду, и она печатает другую опцию, но не :: tcl_platform (threaded) one.Кажется, поддержка потоков не включена. Я бы попытался скомпилировать с поддержкой потока. Спасибо за помощь. – Alok

1

Вам необходимо использовать построенную библиотеку с поддержкой потоков.

При построении без потокового включения TCL внутренне использует довольно много глобальных статических данных в таких местах, как управление памятью. Это довольно распространено. Хотя возможно, что в конечном итоге все будет работать (при условии, что вы выполните всю инициализацию и настройку в рамках одного потока), это будет довольно нецелесообразным. Что-то странное в твоем случае не удивительно.

Когда вы используете построенную по потоку сборку Tcl, все глобальные статические данные преобразуются в данные, зависящие от потока, или соответствующие глобальные данные, защищенные мьютексом. Таким образом, Tcl может использоваться сразу из нескольких потоков. Однако конкретный Tcl_Interp привязан к потоку, который его создал (поскольку он использует множество данных, зависящих от потока). В вашем случае это не будет проблемой; ваши переводчики счастливы в отношении потоков.

(Ну, если вы также добавить вызов для инициализации самой библиотеки Tcl, который нужно только сделать один раз. Положите Tcl_FindExecutable(NULL); внутри main(), прежде чем создавать какие-либо из этих потоков.)


Tcl 8,5 по умолчанию не включен нить в Unix для соображений обратной совместимости. В Windows и Mac OS X он был включен потоком из-за разных способов обработки событий низкого уровня, но это было изменено в 8.6. Я не знаю, как получить построение с поддержкой потоков на RH6 (кроме создания его непосредственно из источника, который должен быть прямым).

+0

Да, я сам скомпилировал его на RH6 с поддержкой потока. Даже если он разбился, я бы добавил вызов - Tcl_FindExecutable (NULL); Давайте посмотрим, если это имеет значение. Спасибо за ответ. – Alok

+0

Hi Donal, без «Tcl_FindExecutable (NULL)»; в main() приложение все еще сбой с Tcl (скомпилировано с опцией --enable-threads). В Интернете я не мог узнать, что делает Tcl_FindExecutable, чтобы заставить Tcl работать с многопоточным приложением. Не могли бы вы дать некоторые идеи/указатели, если у вас есть идея? Заранее спасибо. – Alok

+0

@Alok вызывает сбой, если вы вызываете 'Tcl_FindExecutable'? Как я уже сказал, это первая функция Tcl_ *, которую вы должны вызвать в процессе. Это не сбой, если вы называете их более одного раза (afaik). Просто позвоните. –

Смежные вопросы