0

ここで何が間違っているのかわからないのではないかと心配しています。起動時に 3 つのスレッドを開始するスレッド化されたアプリケーションがあります。

[root@Embest /]# ps 
1111 root        608 S   fw634c_d_cdm_sb
1112 root        608 S   fw634c_d_cdm_sb
1113 root        608 S   fw634c_d_cdm_sb

その後、スタンバイ モードでシリアルからのコマンドを待ちます。実行してスタンバイモードに戻った後、psで何が起こっているのかを確認します。アプリケーションのゾンビ化されたインスタンスがあります (ファイル名も sq.bracketed です)

1114 root            Z   [fw634c_d_cdm_sb]
...
...
...
1768 root            Z   [fw634c_d_cdm_sb]

それらの約628。

つまり、私が従っているポリシーは次のとおりです。

-取り外し可能なスレッドの場合 - 気にしない (完了後に終了し、リソースを解放します)

-結合可能なスレッドの場合 - pthread_create を実行した後に pthread_join を実行し、スレッド化された関数が完了するのを待ちます。このような:

        if (pthread_create(&tmp_thrd_id,&attr_joinable,run_function,(void *)&aStruct)!=0){
            DEBUG(printf("thread NOT created \n"));
        }else{
            DEBUG(printf("thread created !\n"));

            if (pthread_join(tmp_thrd_id,NULL)!=0){ 
                DEBUG(printf("\nERROR in joining \n"));
            }else{
                            DEBUG(printf("Thread completed\n"));
            }
        }

私は main でのみ pthread_exit(NULL) を実行しますが、これはあまり機能せず、起動後は、強制終了してはならないという理由だけでうそをつくだけです。

私はおそらくここで重要なことを忘れています。しかし、スレッドに関するいくつかの基本的なガイドを読んだ後、何を明確にすることはできません....

ご協力ありがとうございました

4

1 に答える 1

0

「ゾンビ」スレッドは、終了したスレッドであり、誰かが pthread_join を呼び出して終了ステータスを収集するのを待っています。したがって、プログラムのどこかでスレッドを作成していて、最終的にそれらのスレッドに対して pthread_join または pthread_detach を呼び出していません。

于 2012-02-13T17:36:15.703 に答える