0
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>

void * function(void *);

main()
{
  pthread_t p[5];
  int j;
  int *arg1[4];
  int arr[5]={1,2,3,4,5};
  for(j=0;j<=4;j++) 
    pthread_create(&p[j],NULL,function,&arr[j]);
  for(j=0;j<=4;j++)
    pthread_join(p[j],(void **)&arg1[j]);
  for(j=0;j<=4;j++)
    printf("\n%d",*arg1[j]);

}

void * function(void *arg)
{
 int *i = (int *) arg;
 pthread_exit(i);
}

Output:
-1498551536
32767
3
4
5

Q.1) 最初の 2 つの値に対して常にジャンク値が出力されます。なぜそうなのですか?ここで何か間違っている場合は修正してください。

以下のようにコードを変更すると、1,2,3,4,5 が正しく出力されます。

  for(j=0;j<=4;j++)
  { 
    pthread_join(p[j],(void **)&arg1[j]);
    printf("\n%d",*arg1[j]);
  }

Q.2) スレッドから値を返すさまざまな方法は何ですか? すべての方法を例を挙げて要約し、どの方法に従うべきかを説明していただけますか?

4

1 に答える 1

1

arg1 のサイズは 4 しかありませんが、5 を埋めています。適切なサイズに設定すると問題が解決します。

うまくいかない例では、印刷する前にすべてのスレッドを pthread_join するまで印刷していません。5 番目のスレッドに参加すると、印刷する前に破損します。

動作する例では、次のスレッドに参加する前に各結果を出力します。これは、5 番目のスレッドが最初と 2 番目の値を上書きする前に印刷することを意味します (それらはまだ上書きされています)。

最初の 2 つが破損している理由は、int がおそらく 32 ビットで、ポインターがおそらく 64 ビットであるためです。したがって、1 つの余分なポインターが次の 2 つの int 位置を台無しにします。

スレッドから複雑な結果を返す場合、pthread_exit は void * を返し、pthread_join は返されるときに出力パラメーターとして値を取得します。

pthread_join

pthread_exit

したがって、プリミティブ値以上を返す必要がある場合は、構造体をまとめて返します。

于 2013-07-18T02:14:20.467 に答える