CとUNIXで書かれた汎用プログラムをビルドしています(Linuxを使用しているので、BSD関数やWIN関数は気にしません) 。SIGINTが呼び出されたときにスレッドを終了する - C
void init_threads(int socket_desc) {
pthread_t chat_threads[2];
ret = pthread_create(&chat_threads[0], NULL, receiveMessage, (void*)(long)socket_desc);
PTHREAD_ERROR_HELPER(ret, "Errore creazione thread ricezione messaggi");
ret = pthread_create(&chat_threads[1], NULL, sendMessage, (void*)(long)socket_desc);
PTHREAD_ERROR_HELPER(ret, "Errore creazione thread invio messaggi");
}
このプログラムは、私はCTRL-Cの可能性を実装するシェルから起動されますので、私はこのコード行で行ったので:
signal(SIGINT,kill_handler);
// and its related function
void kill_handler() {
// retrive threads_id
// call pthread_exit on the two threads
printf("Exit from program cause ctrl-c, bye bye\n");
exit(EXIT_SUCCESS);
}
私の質問は、私がどのように見出すことができていますスレッドIDはイベントハンドラ関数の中にあり、pthread_exitを呼び出すのは正しいですか?何か他のものを使うべきですか?
[シグナルハンドラでスレッドを正しく終了させるにはどうすればいいですか?](https://stackoverflow.com/questions/25950621/how-to-properly-terminate-a-thread-in-a-signal-ハンドラ) – Gaurav
シグナルはメインスレッドに配信されます。そこにexit()するだけで、OSはあなたのためにクリーンアップを行います。 – Ctx
ディープサーチの20分後に重複が見つかりませんでした。私のプログラムではソケットを使用しているので、Felix Palmenの答えは@Ctxのコメントよりも優れていると評価されています。ソケットが開いていると、ソケットが聞こえなくても短時間ソケットが開かれます。とにかく、みんなに感謝します。 – Thecave3