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) 它总是打印前两个值的垃圾值。为什么会这样?如果这里有什么问题,请纠正我。

当我更改如下代码时,它会正确打印 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 所有线程时才打印它们。当您加入第五个线程时,您会在打印之前出现损坏。

在您的示例中,在加入下一个线程之前打印每个结果。这意味着您在第五个线程覆盖第一个和第二个值之前打印(它们仍在被覆盖)。

前两个损坏的原因是因为您的 int 可能是 32 位的,而您的指针可能是 64 位的。所以 1 个额外的指针会弄乱接下来的两个 int 位置。

对于从线程返回复杂结果,pthread_exit 返回一个 void *,pthread_join 在返回时获取该值作为输出参数。

pthread_join

pthread_exit

因此,如果您需要返回的不仅仅是原始值,那么请组合一个结构并返回它。

于 2013-07-18T02:14:20.467 回答