質問

の使用について疑問に思っていました 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().

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top