0

我目前正在编写一些 C 代码,对 C 来说非常新,所以如果这是一个有点基本或愚蠢的问题,我深表歉意。

我有以下代码,它使用pthread_create().

if (ps.status == completed)
        {
            LOG(LOG_AUDIO, "evsafewait_sm_play_tone:\tPlay tone complete");
            if (e2)
            {
                LOG(LOG_MUST, "Failed to free tone event. Result: %i", e2);
            }

            pccb->playToneComplete = 1;
            LOG(LOG_AUDIO, "Detatching thread ID %x", manageToneParms->toneManagerThread);
            //pthread_detach(manageToneParms->toneManagerThread);

            int retVal;
            pthread_exit(&retVal);
            LOG(LOG_AUDIO, "THREAD TERMINATED WITH RESULT %i", retVal);
            LOG(LOG_AUDIO, "Freeing memory");

            free(manageToneParms->playToneParms);
            free(manageToneParms);
            return 0;
        }  

在结构空闲并且方法返回之前,我试图退出线程使用pthread_exit(),但是当它被调用时,它下面的所有内容都被跳过,没有错误显示,据我所知。

我试过用 GDB 调试它,当pthread_exit()它被调用时,它打印出来的下一件事是siglongjmp,我不知道这是什么,我不相信它在 C 代码中,至少不在我所做的更改中它。

我怎样才能退出这个线程?我也尝试过pthread_exit(NULL)pthread_kill(threadID, SIGKILL)但这会杀死整个程序而不仅仅是线程。

4

1 回答 1

1

pthread_exit()从调用点的线程返回。之后的任何代码pthread_exit()都不会被执行。

您应该确保在调用之前释放线程中分配的所有内存pthread_exit()

你有没有尝试过这样的事情:?

int retVal;

/* free resources -- make sure all resources allocated in thread 
   function are released 
*/
free(manageToneParms->playToneParms);
free(manageToneParms);

LOG(LOG_AUDIO, "THREAD TERMINATED WITH RESULT %i", retVal);
LOG(LOG_AUDIO, "Freeing memory");
pthread_exit(&retVal);
于 2012-09-28T18:01:25.180 回答