2

我有一个应用程序,其中我有 1 个主线程,它创建 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);
}

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

4

2 回答 2

3

对于这种情况

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

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

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

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

一般来说

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

LLNL POSIX 线程编程页面:

如果您没有显式调用 pthread_exit(),那么如果 main() 在它产生的线程之前完成,就会有一个明确的问题。它创建的所有线程都将终止,因为 main() 已完成并且不再存在以支持线程。

另请参阅 pthread_exit手册页

于 2012-10-10T19:52:15.787 回答
0

您需要决定您的线程 (1) 是否需要以明确定义的方式(状态)结束,或者后者是否无关紧要 (2) 注意何时何地可以取消它们(当程序结束时隐式发生)

参考1:一种可能的方法是实现一个退出条件,当程序终止并使线程离开其while(1)循环时将触发该条件。在离开main循环调用它收到的pthread_join()任何调用之前。如果所有线程都终止,则剩下的连接循环和 main 结束,所有线程都已经终止。pthread_t pthreadpthread_create()main

参考 2:这是更关键的情况,因为取决于线程函数的代码,不清楚它将在哪里取消,这可能导致意外行为。可以在所谓的取消点取消线程。一些系统调用被视为这样

无论如何,线程函数不一定需要pthread_exit()作为最后一条语句调用。仅当您希望pthread_join()接收传递给 的指针时才需要这样做pthread_exit()

于 2012-10-11T09:49:50.137 回答