atexit
電話をかけることは合法pthread_exit
ですか?これがないと、main()
すべてのスレッドが終了します。main()
(簡単な解決策は、それ自体を呼び出すように変更することpthread_exit()
ですが、この最小限の例が派生したインスタンスではそれは不可能です)。
#include <unistd.h>
#include <cstdlib>
#include <iostream>
#include <pthread.h>
void *foo(void *data) {
for (int i = 0; i < 10; ++i) {
std::cout << i << "\n";
sleep(1);
}
return NULL;
}
void foo_init() {
std::atexit([](){
pthread_exit(NULL);
});
}
int main() {
foo_init();
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_t thr;
pthread_create(&thr, &attr, foo, NULL);
}
状態のマンページpthread_exit
:
スレッドの終了は、ミューテックスやファイル記述子を含むがこれらに限定されないアプリケーションに表示されるプロセスリソースを解放しません。また、存在する可能性のあるatexit()ルーチンの呼び出しを含むがこれらに限定されないプロセスレベルのクリーンアップアクションも実行しません。
これは、クレイジーな再帰が物事を壊すリスクを排除しているようです。
また、次のように述べています。
pthread_exit()の暗黙的または明示的な呼び出しの結果として呼び出されたキャンセルクリーンアップハンドラーまたはデストラクタ関数から呼び出された場合、pthread_exit()の動作は未定義です。
これは、呼び出すことが定義されていない場所があることを示していますがpthread_exit
、(メインが戻るのに10秒以上かかる場合を除き、「実際の」ケースでは不可能であると想定します)、適用できません。
この例は「私のために機能します」が、POSIXで機能する必要がありますか?そうでない場合、それは未定義または未指定ですか?