メインスレッドの破壊順序とpthread_key_createの使用
-
28-10-2019 - |
質問
の使用について疑問に思っていました pthread_key_create
デストラクタ関数を通過している間。
私はこのようなものを持ちたかった:
static ComplexObject foo;
void workoncomplex(void *) {
foo.dosomestuff();
}
static pthread_key_t pthreadkey;
void function_called_by_threads() {
pthread_key_create(&pthreadkey, workoncomplex)
}
明らかに、私はかなりの量の詳細を除外しました。
メインスレッドではないスレッドの場合、これは明らかに問題ありません(ロックなどを提供)、スレッドが死ぬたびに workoncomplex
関数が呼び出され、操作されます foo
物体。
私の質問は、これはメインスレッドにとって有効です。 pthreadkey
デストラクタの呼び出しは、スレッドウィンドダウンで発生しますが、静的が破壊される前に実行することが保証されていますか?もしそうなら、私がメインスレッドにいて、すぐに戻るかどうかを確認する必要がありますか?または、すべてのスレッドを同じで扱い、静的オブジェクトがまだ周りにあると仮定することもできます。
解決
Destructor関数は、アプリケーションの出口で呼び出されません。スレッドが終了したときにのみ呼び出されます。
メインスレッドを終了する場合 pthread_exit()
その後、Destructor機能が呼び出されますが、アプリケーションはまだシャットダウンされていないため、 static
変数。
あなたが電話するなら exit()
またはから戻ります main()
その後、デストラクタ関数は呼び出されないので、 static
変数が破壊されることは問題ではありません。使用する atexit()
あなたのデストラクタ機能が戻りに呼び出されることを確認するために main()
またはの呼び出しで exit()
.
所属していません StackOverflow