我目前正在研究一些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)
但是这会杀死整个程序而不仅仅是线程。
答案 0 :(得分: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);