Pthread_join& pthread_exit在c

时间:2013-07-18 02:01:46

标签: c pthreads pthread-join

#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)从线程返回值的不同方法是什么?您能否通过实例总结所有方法并解释哪一种方法可以遵循?

1 个答案:

答案 0 :(得分:1)

你的arg1只有4号,但是你正在填充5.将它设置为合适的大小将解决你的问题。

在你的不起作用的例子中,在你打印它们之前,你不会打印pthread_join所有线程。加入第五个帖子时,在打印之前会出现损坏。

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

它是前两个被破坏的原因是因为你的int可能是32位而你的指针可能是64位。因此,一个额外的指针会混淆接下来的两个int位置。

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

pthread_join

pthread_exit

因此,如果您需要返回超过原始值的值,那么将结构放在一起并返回该结构。