4

以下のコードでは、スレッド ID を自分自身として pthread_join() を呼び出しています。その結果、エラー番号 35 が返されます。同じように、perror で印刷しようとしています。しかし、それは「成功」を示しています。私の疑問は、ライブラリ/システムコールが明示的にエラーのエラー番号を設定する必要があるか、または何か見逃していましたか?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>

#define DEATH(mess) { perror(mess); exit(errno); }

static void * threadFunc(void *arg)
{
 void *res;
 printf("sleeping for 2 sec ...\n");
 sleep(2);
 char *s = (char *) arg;
 pthread_t t = pthread_self();
 int relval = pthread_join(t, &res);

 if (relval) 
  perror("deadlock");

  printf("return value is %d .....\n",relval);
  return (void *) strlen(s);
}

int main(int argc, char *argv[])
{
 pthread_t t1;
 void *res;
 int ret;

 ret = pthread_create(&t1, NULL, threadFunc, "Hello world\n");
 if (ret != 0)
    DEATH ("pthread_create");

 printf("Message from main()\n");

 pthread_exit(&res);
 exit(EXIT_SUCCESS);

}

o/p

Message from main()
sleeping for 2 sec ...
deadlock: Success
return value is 35 .....
4

3 に答える 3

7

sr 関数を設定するerrno必要も、そのままにしておく必要もありません。あなたはいつでも自由にできます:

errno = pthread_join(t, &res);
于 2013-02-09T19:12:48.407 に答える
3

pthread_join() は errno 値を設定しません

ここでの議論を参照してください。

pthread: 切り離されたスレッドに参加すると、errno が正しく設定されません

あなたの最善の策は、 pthread_join の戻り値を使用することです

于 2013-02-09T19:31:09.323 に答える
2

いくつかのこと。

  1. スレッド自体から結合を行うべきではありません。結合は親スレッドから行われ、そこにあるリソースをクリーンアップすることになっています。
  2. errno 変数はスレッドごとの変数です。スレッド内でアクセスする場合とメインでアクセスする場合の値は異なります。
于 2013-02-09T22:39:50.560 に答える