gpt4 book ai didi

c - 退出清理线程

转载 作者:行者123 更新时间:2023-12-03 12:56:29 31 4
gpt4 key购买 nike

我有一个应用程序,其中有 1 个主线程,它创建 10 个不同的线程来完成某些工作。在应用程序结束时,当我尝试退出时,应用程序无法干净地退出。堆栈跟踪不是那么有用,但它显示了函数“cancel_deliver()”中的崩溃我的第一个猜测是这是在释放每个线程使用的资源时所做的一些底层调用,但并不完全确定。

仅供引用:每个线程的回调函数都有一个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);
}

我可以做些什么来释放线程使用的资源并干净地退出?

最佳答案

对于这种情况

如果我正确理解您的设置...

您可以做的一件事是拥有一组“标志”变量,每个线程(包括主线程)一个。当主线程准备结束时,设置它的标志。应该在 10 个其他线程中不断检查此标志。一旦设置,更改该特定线程的标志变量并调用 pthread_exit .在主退出方法中,只有在设置了所有标志变量后才终止。

假设您的程序没有因其他原因崩溃,这应该使所有线程都能以受控方式完成。

(或在主退出函数中使用 pthread_join,因为 pthread_exit 返回 pthread_join 使用的信息)

一般情况

使用 pthread_exit而不是 exit(1)干净地退出线程。

来自 LLNL POSIX 线程编程页面:

There is a definite problem if main() finishes before the threads it spawned if you don't call pthread_exit() explicitly. All of the threads it created will terminate because main() is done and no longer exists to support the threads.



另请参阅 pthread_exit man page .

关于c - 退出清理线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12827181/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com