4

次のコードは pthread の参加に失敗し、「参加に失敗しました」というメッセージが出力されます。障害とその原因に関する詳細情報を取得するにはどうすればよいですか?

pthread_t aThread[MAX_LENGTH];
    int errCode[MAX_LENGTH];
    char returnVal;    
for(int i = 0; i < MAX_LENGTH; i++)
    {

        if((errCode[i] = pthread_create(&aThread[i], NULL, &findMatch, &fpArgs)) != 0)
            printf("error creating thread %d\n", errCode[i]);
        if(!pthread_join(aThread[i], (void**)&returnVal))
            printf("join failed\n i is %d", i);
    }

編集:実際に結合が返さno errorれ、私は間違いを犯しました。!if ステートメントには、true と評価される問題がある場合、join がゼロ以外の数値を返すため、 を含める必要はありません。

4

5 に答える 5

4

関数が失敗すると (つまり、任意の pthread 呼び出しでゼロ以外のリターン コードが返された場合)、関数は失敗errnoの理由の値に設定されます。エラー コードのテキストによる説明を取得するには、いくつかの方法があります。

int returnval;

if((returnval = pthread_join(aThread[i], (void**)&returnVal)) != 0)
{
    printf("error joining thread: %s\n", strerror(returnval));  //1st optiop

    perror("error joining thread:");  //2nd option

    printf("error joining thread: %m\n");  //3rd option

}

(1)strerrorは、渡したエラー値のエラー文字列を出力し、printf ステートメントに配置するのに便利です。

(2)perror最初に表示される小さな文字列を渡すことができ、次に設定されている値のエラーの説明が自動的に表示errnoされます。を明示的に渡す必要はありませんerrno

(3) のように動作する変換指定子をprintf提供するglibc 拡張機能がありますが、手間と手間が少し少なくなります。これは移植性が最も低いでしょう。%mstrerror

説明を取得すると、失敗した呼び出しの man ページを簡単に調べることができ、呼び出しが失敗した理由に関するより詳細なヒントが得られます。Charlie Burns は、pthread_join失敗する可能性がある理由を投稿しました。

于 2013-10-10T04:31:06.873 に答える
0

すなわち::

int retVal = pthread_create(&myThread, NULL,myThreadFn, NULL);
printf("error joining thread: %d\n", retVal);
于 2015-07-28T09:51:26.200 に答える