#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)从线程返回值的不同方法是什么?您能否通过实例总结所有方法并解释哪一种方法可以遵循?
答案 0 :(得分:1)
你的arg1只有4号,但是你正在填充5.将它设置为合适的大小将解决你的问题。
在你的不起作用的例子中,在你打印它们之前,你不会打印pthread_join所有线程。加入第五个帖子时,在打印之前会出现损坏。
在您的示例中,在加入下一个线程之前打印每个结果。这意味着您在第五个线程覆盖第一个和第二个值之前进行打印(它们仍然被覆盖)。
它是前两个被破坏的原因是因为你的int可能是32位而你的指针可能是64位。因此,一个额外的指针会混淆接下来的两个int位置。
对于从线程返回复杂结果,pthread_exit返回void *,pthread_join在返回时将值作为输出参数获取。
因此,如果您需要返回超过原始值的值,那么将结构放在一起并返回该结构。