4

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か?デストラクタの呼び出しはスレッドの終了時に発生するのは明らかですが、スタティックが破棄される前に実行されることが保証されていますか?もしそうなら、私はメインスレッドにいるかどうかを確認し、すぐに戻る必要がありますか?または、すべてのスレッドを同じように扱い、静的オブジェクトがまだ存在していると想定することはできますか。

4

1 に答える 1

2

デストラクタ関数は、アプリケーションの終了時に呼び出されません。スレッドが終了したときにのみ呼び出されます。

でメインスレッドを終了するとpthread_exit()、デストラクタ関数が呼び出されますが、アプリケーションはまだシャットダウンされていないため、static変数を安全に使用できます。

呼び出しexit()たり、そこから戻ったりしてmain()も、デストラクタ関数は呼び出されないため、static変数が破棄されることは問題ではありません。atexit()からの戻り時main()またはの呼び出し時にデストラクタ関数が呼び出されるようにするために使用しますexit()

于 2011-06-15T11:53:12.190 に答える