退出tcl_dooneevent功能



i具有在C 文件中采购的TCL文件。为此,我最终使用了TCL_DooneEvent功能来照顾所有TCL调用。我在主函数中也有几个线程。为了从所有线程和功能退出,我写了一个退出函数。因此,在当前情况下,我看到所有PTHreads和其他功能均被终止,但最终调用的TCL_DooneEvent函数。这给出了分割错误。有没有办法从其他函数中退出(1)函数。

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 
}

为了退出while循环,您应该更改循环的条件,并使其取决于可以从另一个线程更改的变量(将其声明为挥发性)。

volatile bool exitLoop = false;
while (!exitLoop) 
{
    Tcl_DoOneEvent(TCL_ALL_EVENTS);
}

我不确定,但是如果没有任何事件,这可能会无限期地阻止。两个可能的解决方案可能使用tcl_dont_wait标志:

Tcl_DoOneEvent(TCL_ALL_EVENTS | TCL_DONT_WAIT);
// sleep some time here in order to avoid busy wait

或更高,从您的退出函数触发事件,以便tcl_dooneevent醒来,在下一个迭代中,您的exitloop变量为真。

最后,我建议您遵循所有线程的相同循环和退出条件方法。而不是使用pthread_cancel完成线程,而是尝试使用pthread_join。这样,您可以准确控制线程退出的位置,并且可以进行一些清理并避免分割故障或其他类型的错误。

相关内容

  • 没有找到相关文章

最新更新