2012-09-28 50 views
0

我目前正在研究一些C代碼,對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

'pthread_exit'完成它應該做的事情:立即停止線程並且不在線程上執行任何其他操作。至於退出線程,最簡單的方法是完成線程功能。換句話說,你的'return 0'應該可以做到。您還需要在主線程中使用'pthread_join'或'pthread_detach'來完全擺脫線程。 – Arkadiy

+0

@Arkadiy,現在這很明顯,可能是任何人在這裏問過的最愚蠢的問題。我認爲返回可能是這種情況,但我想嘗試顯式調用exit,因爲我已經對代碼進行了更改,似乎引入了內存泄漏,並認爲該線程可能與它有關。] – Boardy

+0

內存泄漏的領域變得越來越廣泛,正是通過做這件事來做到這一點。即pthread_exit()是我真正希望不存在的那些函數之一。線程proc的乾淨運行始終需要努力,並且使得它更容易確保以代碼組織方式正確清理事件。 – WhozCraig

回答

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);