我有一个应用程序,其中我有一个主线程,它可以创建10个不同的线程来完成某项工作。在应用程序结束时,当我尝试退出时,应用程序无法干净地退出。堆栈跟踪没有那么有用,但是它显示了函数“cancel_deliver()”中的崩溃我的第一个猜测是这是在释放每个线程使用的资源时所做的一些底层调用,但并不完全确定。
fyi:每个线程的回调函数都有一个while(1)循环:
这是片段
void main (...)
{
pthread_t tid;
for (int i=0; i<10; i++)
pthread_create(&tid, NULL, xyzCallback, NULL);
}
void xyzCallback(void* data)
{
while (1)
{
////
}
}
void atExit()
{
exit(1);
}
我有什么办法可以解放我的线程使用的resrouces并干净地退出吗?
答案 0 :(得分:2)
对于这种情况
如果我理解你的设置正确......
你可以做的一件事是有一组'flag'变量,每个线程一个(包括主线程)。当主线程准备结束时,设置其标志。应该在其他10个线程中不断检查此标志。设置完成后,更改该特定线程的标志变量并调用pthread_exit
。在主退出方法中,只有在设置了所有标志变量后才终止。
假设您的程序由于其他原因没有崩溃,这应该使所有线程以受控方式完成。
(或在主要退出功能中使用pthread_join
,因为pthread_exit
会返回pthread_join
使用的信息
一般
使用pthread_exit
代替exit(1)
来彻底退出主题。
从LLNL POSIX线程编程页面:
如果你没有显式调用pthread_exit(),那么如果main()在它产生的线程之前完成,那么肯定存在问题。它创建的所有线程都将终止,因为main()已经完成并且不再存在以支持线程。
另请参阅pthread_exit man page。
答案 1 :(得分:0)
你需要决定你的线程(1)是否需要以明确定义的方式(状态)结束,或者如果后者无关紧要(2)注意何时何时可以取消它们(这种情况在程序结束)
参考1:可能的方法是实现退出条件,当程序终止并使线程离开while(1)
循环时将触发退出条件。在离开调用main
之前收到的任何pthread_join()
的{{1}}循环调用pthread_t pthread
之前。如果所有线程都终止了pthread_create()
的连接循环,则主端以所有线程终止。
参考2:这是更关键的情况,因为根据线程函数的代码,不清楚它将被取消的位置,这可能导致意外行为。可以在所谓的取消点取消线程。 Some system calls are treated as such。
在任何情况下,线程函数不一定需要调用main
作为最后一个语句。仅当您希望pthread_exit()
接收传递给pthread_join()
的指针时,才需要这样做。