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 に答える