概要
アホなミスで数時間詰まったので備忘録。
C でマルチスレッドのプログラムを作成し、実行したところ、
Illegal instruction (core dumped)
というエラーが発生した。
原因は、存在しないスレッドのハンドルを取得しようとしたためだった。
具体的には、定義していない関数のポインタを、pthread_create()
に渡していたことが原因であった。定義したら直った。
詳細
スレッド作成について
hoge
という関数のスレッドを作成する時は、↓の手順を踏む。
pthread_t hoge_thread; // pthread_create に渡すヤツ.
void *hoge(void *fuga); // プロトタイプ宣言.
// 定義.
void *hoge(void *fuga){
int i = 0;
while(i < 10){
printf("fuga\n");
sleep(1);
i++;
}
return NULL;
}
// スレッド作成.
if(pthread_create(&hoge_thread, NULL, hoge, NULL)){
perror(hoge_thread create failed\n);
exit(EXIT_FAILURE);
}
if(pthread_join(&hoge_thread, NULL)){
perror(hoge_thread create failed\n);
exit(EXIT_FAILURE);
}
問題発生時
Illegal instruction (core dumped)
とやらが発生した時は、上記サンプルコードにおける「定義」が抜けていた。
この状態で gdbserver によるデバッグを実行すると、
Cannot get thread handle for LWP 505: generic error
というエラーが発生した。
スレッドの定義をしていないのだから、ハンドラの取得に失敗するのも当然である。
解決
関数を定義したら出なくなった。
やったー!
まとめ
マルチスレッド時は、エディタ上で関数のプロトタイプ宣言部分を確認し、関数が未定義のままじゃないかチェックしよう、ヨシ!
ちなみに未定義だと↓のようになんか点線が入る。