pthread_exit を明示的に呼びたいけど、警告も出したくない

こんなコードがあったとして

#include <pthread.h>

void *sub(void *unused) {
    pthread_exit(NULL);
}

int main(int argc, char *argv[]) {
    pthread_t thread;

    pthread_create(&thread, NULL, sub, NULL);
    pthread_join(thread, NULL);

    return 0;
}

これをこのようにコンパイルすると

$ gcc -lpthread -Wall foo.c
foo.c: In function ‘sub’:
foo.c:5: warning: control reaches end of non-void function

こんな感じで警告が出る。


pthread_exit はスレッドを抜けるときにスタックなどをクリーンアップしてくれる関数で、上記の使い方は正しいんだけど、戻り値のある関数を抜ける際に return 文がないことで警告が出るのがうっとおしい。

void *sub(void *unused) {
    pthread_exit(NULL);
    return NULL;
}

上記のように書くことで警告が出ないようにすることができるんだけど、pthread_exit は呼び出されると呼び出し元に制御を戻さないので、警告を出さないようにするだけの無駄なコードなので、こういう書き方は控えたい。

void *sub(void *unused) {
    return NULL;
}

妥協策としてこうなってしまう。

pthread_exit は明示的に呼び出さなくても、スレッド生成元の関数が終了した時点で暗黙に呼び出されるので、クリーンアップのタイミングがスレッド終了時ではなく、スレッド生成元関数の終了時になってしまうが、コードとしてはすっきりする。ただし、やはりクリーンアップのタイミングが異なるので、最初のコードで行いたい。

参照させてもらったページから一部引用。

スレッド(メインスレッドは除く)を作成した関数が関数から抜ける時に、暗黙のうちにpthread_exit()が呼び出されます。

pthread日記(12) - pthread_exit() | Silphireの日記 | スラド