curl †
エラーコード †
libcurl †
スレッド実行の注意点 †
- CURLOPT_NOSIGNALを設定すると、cURL関数がプロセスにシグナルを送らなくなる
- POSIX互換システム上での経験則として、スレッド(thread)とシグナル(singal)の併用はトラブルの元です
- 良くあるシナリオとしてはスレッドライブラリ内部実装でシグナルを利用しており、ユーザアプリ側のシグナル利用と干渉して誤動作やクラッシュを引き起こしたりします
- libcurl内ではデフォルト設定でシグナル利用し、ユーザアプリとリンクされる"スレッドライブラリ内"でもシグナル利用する。このとき、"相互"にシグナルを拾って意図しない動作をする可能性がある。
- 初期化処理を明示的に記載していない場合、「curl_easy_init()」内部で「curl_global_init()」が、「curl_easy_cleanup()」内部で「curl_global_cleanup()」が呼ばれる
- しかし「curl_global_init()」と「curl_global_cleanup()」はスレッドセーフ」ではない
- 上記処理の初期化から終了までの間に、別スレッドから初期化処理が実行されると
「segmentation fault」が発生してアプリが落ちる
- それを回避するには、「curl_global_init()」をアプリ開始時に1回、「curl_global_cleanup()」をアプリ終了時に1回実行されるような作りにすれば良い