У меня есть файлы TCL, которые получены в файлах на C++. , для которого я использовал функцию Tcl_DoOneEvent в конце, чтобы позаботиться обо всех вызовах TCL. У меня также есть несколько потоков, вызываемых в функции Main. чтобы выйти из всех потоков и функций, у меня есть функция quit. поэтому в текущем случае я вижу, что все pthreads и другая функция завершаются, за исключением функции Tcl_DoOneEvent, вызванной в конце. который выдает ошибку сегментации. есть способ выйти из функции while (1) из другой функции.Выход из функции Tcl_DoOneEvent
main()
{
...
...
pthread_create(thread1);
pthread_create(thread2);
while(1) Tcl_DoOneEvent(TCL_ALL_EVENTS);
return(0);
}
quit_fn()
{
...
...
pthread_cancel(thread1);
pthread_cancel(thread2);
...
// exit(0) ; -> this also results in segmentation error
}
Наличие функции quit посылает событие в основной поток, это рекомендуемый подход. Событие может иметь тривиальный обработчик, или обработчик события может быть тем, что устанавливает 'exitLoop', который тогда не должен быть' volatile', поскольку он доступен только из одного потока. 'TCL_DONT_WAIT' не рекомендуется для этого случая использования; Tcl отлично подходит для событий без него. –
Я согласен с этим, отправляя мероприятие и позволяя Tcl справляться со сном лучше. volatile не требуется, при условии, что флаг никогда не используется из других потоков (но мы не знаем, так ли это из кода). –