2

あるジョブを実行するために 10 個の異なるスレッドを作成する 1 つのメイン スレッドを持つアプリケーションがあります。アプリケーションの最後に終了しようとすると、アプリケーションを正常に終了できません。スタック トレースはそれほど有用ではありませんが、関数 "cancel_deliver()" のクラッシュを示しています。私の最初の推測では、これは、各スレッドで使用されるリソースを解放する際に実行された何らかの呼び出しであると推測されますが、完全にはわかりません。

fyi: 各スレッドのコールバック関数には、while (1) ループがあります。

ここにスニペットがあります

void main (...)
{
    pthread_t tid;
    for (int i=0; i<10; i++)
        pthread_create(&tid, NULL, xyzCallback,  NULL);
}

void xyzCallback(void* data)
{
    while (1)
    {
       ////
    } 
}

void atExit()
{
    exit(1);
}

スレッドで使用されているリソースを解放して、きれいに終了するためにできることはありますか?

4

2 に答える 2

3

この場合

私があなたのセットアップを正しく理解していれば...

実行できることの1つは、スレッド(メインスレッドを含む)ごとに1つずつ、一連​​の「フラグ」変数を用意することです。メインスレッドを終了する準備ができたら、そのフラグを設定します。このフラグは、他の10個のスレッド内で継続的にチェックする必要があります。設定されたら、その特定のスレッドのフラグ変数を変更して、を呼び出しますpthread_exit。main exitメソッドでは、すべてのフラグ変数が設定された後でのみ終了します。

別の理由でプログラムがクラッシュしていないと仮定すると、これにより、すべてのスレッドが制御された方法で終了できるようになります。

(または、によって使用される情報を返すpthread_joinため、メイン出口関数で使用します)pthread_exitpthread_join

一般に

pthread_exit代わりにを使用exit(1)して、スレッドをきれいに終了します。

LLNL POSIXスレッドプログラミングページから:

pthread_exit()を明示的に呼び出さないと、main()が生成されたスレッドの前に終了する場合、明確な問題があります。main()が実行され、スレッドをサポートするために存在しなくなったため、作成されたすべてのスレッドが終了します。

pthread_exitのマニュアルページも参照してください。

于 2012-10-10T19:52:15.787 に答える
0

スレッドを (1) 明確に定義された方法 (状態) で終了する必要があるかどうか、または後者が重要ではない場合 (2) いつどこでスレッドをキャンセルできるかを考慮する必要があります (プログラムの終了時に暗黙的に発生します)。

while(1)参照 1: 考えられる方法は、プログラムが終了し、スレッドがループを離れたときにトリガーされる終了条件を実装することです。への呼び出しによって受信したすべてのmain呼び出しのループを終了する前に。すべてのスレッドが終了すると、の結合ループが終了し、すべてのスレッドが終了した状態で main が終了します。pthread_join()pthread_t pthreadpthread_create()main

参照 2: これはより重大なケースです。スレッド関数のコードによっては、どこでキャンセルされるかが明確でなく、予期しない動作につながる可能性があるためです。スレッドは、いわゆるキャンセル ポイントでキャンセルされる可能性があります。一部のシステム コールは、そのように扱われます。

いずれにせよ、スレッド関数は必ずしも最後のステートメントとして呼び出す必要はありません。これは、 に渡されたポインターを受け取りpthread_exit()たい場合にのみ必要です。pthread_join()pthread_exit()

于 2012-10-11T09:49:50.137 に答える