-1

私のプログラムはいくつかのスレッドを作成する必要がありますが、リターン ( safe ) が 0 ではなく 3 であるため、常にエラーのケースになるため、pthread_join で立ち往生しています。 .

編集:自分自身をよりよく説明するために、エラーは、コードが想定されていないときにエラー処理領域に入っていることです。これは、「エラー待機中:成功」メッセージが表示されることを意味します。

int main() {    

  pthread_t tids[NUM_THREADS];
  int a, i, resultado, safe ;
  char *f ;

  f = (char *)malloc(sizeof(SIZEFICHEIRO));
  a = randomnum(4);
  f = pickfile(a, f);

  for ( i=0; i<NUM_THREADS ; i++ )
  {
    safe = pthread_create( &tids[i] , NULL , (void *)verificador , (void *) f) ;
    if ( safe != 0 )
        perror ("Error creating threads");
  }

  for ( i=0; i<NUM_THREADS ; i++ )
  {
    safe = pthread_join( tids[i], (void **)&resultado ) ;
    if ( safe != 0 )     // Error here
        perror ("Error waiting");

    printf("Result(0:Works ; -1:error) =  %d\n", resultado);
  }

}
4

2 に答える 2

0
safe = pthread_join( tids[i], (void **)&resultado ) ;
printf("%d", error );
if ( safe != 0 )     // Error here
    perror ("Error waiting");

ほとんどの呼び出しがそうであるようにpthread_join、エラーを に隠した場合、問題は、 への呼び出しによって、 によって隠しられたエラー コードが変更される可能性があることです。エラーを出力するために呼び出す場合は、エラーを生成した関数が戻った直後に呼び出す必要があります。errnoprintfpthread_joinperror

ただし、pthread_joinエラーを に隠しておらず、エラーをerrno返します。したがって、呼び出しperrorは機能しません。あなたはこれを行うことができます:

if ( safe != 0 )     // Error here
{
    errno = safe;
    perror ("Error waiting");
}

また

if ( safe != 0 )
    printf ("Error waiting: %s\n", strerror (safe));
于 2014-11-06T23:20:22.003 に答える
0

このコードをテストしました:

int main() 

{   

  pthread_t tids[NUM_THREADS];
  int a, i, resultado, safe ;
  char *f ;

  f = (char *)malloc(sizeof(SIZEFICHEIRO));
  a = randomnum(4);
  f = pickfile(a, f);

  for ( i=0; i<NUM_THREADS ; i++ )
  {
    safe = pthread_create( &tids[i] , NULL , (void *)verificador , (void *) f) ;
    if ( safe != 0 )
        perror ("Error creating threads");
  }

  for ( i=0; i<NUM_THREADS ; i++ )
  {
    safe = pthread_join( tids[i], (void **)&resultado ) ;
    if ( error != 0 )
        errno = safe;
        perror ("Error waiting");

    printf("Result(0:Works ; -1:error) =  %d\n", resultado);
  }
}

結果は次のとおりです。

Error waiting: Success
Result(0:Works ; -1:error) = 0
Error waiting: Success
Result(0:Works ; -1:error) = 0
Error waiting: No such process
Result(0:Works ; -1:error) = 0
Error waiting: No such process
Result(0:Works ; -1:error) = 0
Error waiting: No such process
Result(0:Works ; -1:error) = 0
Error waiting: No such process
Result(0:Works ; -1:error) = 0
于 2014-11-07T00:31:30.880 に答える