我有TCL文件,这些文件来自C ++文件。 为此我已经使用了Tcl_DoOneEvent函数来处理所有TCL调用。 我还在Main函数中调用了一些线程。为了退出所有线程和函数我写了一个退出函数。所以在当前的情况下,我看到所有的pthread和其他函数都被终止,除了最后调用的Tcl_DoOneEvent函数。这是一个分割错误。 有没有办法从其他功能退出while(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
}
答案 0 :(得分:1)
为了退出while循环,您应该更改循环的条件并使其依赖于您可以从另一个线程更改的变量(将其声明为volatile)。
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变量为true。
最后,我建议您对所有线程遵循相同的循环和退出条件方法。不要使用pthread_cancel来完成一个线程,而是尝试使用pthread_join。这样你就能准确控制线程退出的位置,你可以做一些清理工作,避免出现分段错误或其他类型的错误。