关于linux编程多线程求和
- 思路:在创建多个线程,把求和的工作放在每个线程上。再把每个线程求出的和,放回到主线程上进行求和
项目场景:
提示:这里简述项目相关背景:
例如:项目场景:作为刚新手,不知道怎样把返回值线程中返回到主线程。
问题描述:
提示:这里描述项目中遇到的问题:
例如:不知道怎样从线程中返回值!
void *tfn(void *arg)
{
int i = (int)arg;
int sum1=0,sum2=0,sum3=0,sum4=0;
int sum=0, a;
if(i==0)
{
sleep(1);
printf("I'm %dth pthread, pthread_id = %lu", i+1, pthread_self());
for( a=1;a<10000;a++)
sum1=sum1+a;
printf("(1~10000)sum1=%d\n",sum1); //**我想返回sum1的值**
原因分析:
提示:这里填写问题的分析:
例如:利用pthread_join阻塞等待线程退出,获取线程退出状态(相当于进程中waitpid()函数
解决方案:
提示:这里填写该问题的具体解决方案:
例如:在每个线程后面加上return(void*)sum*;把要返回的值都加上去,在主线程上用一个for循环把每个要返回的值接收下;
话不多上主菜:
#include<stdio.h>
#include<pthread.h>
#include<math.h>
#include<stdlib.h>
//获取时间函数
double t1,t2;
double get_time()
{
struct timeval t;
gettimeofday(&t,NULL);
return t.tv_sec + t.tv_usec/1000000.0;
}
void *tfn(void *arg)
{
int i = (int)arg; //接收arg的值和转换int型
int sum1=0,sum2=0,sum3=0,sum4=0;
int sum=0, a;
if(i==0) //通过i来区别每个线程
{
sleep(1);
t1=get_time();
printf("I'm %dth pthread, pthread_id = %lu", i+1, pthread_self());
for( a=1;a<10000;a++)
sum1=sum1+a;
t2=get_time();
printf("(1~10000)sum1=%d,t1=%f\n",sum1,t2-t1);
return (void*)sum1; //通过return返回sum1的值(注意(void*))
}else if (i==1){
sleep(2);
t1=get_time();
printf("I'm %dth pthread, pthread_id = %lu ", i+1, pthread_self());
for( a=10000;a<20000;a++)
sum2=sum2+a;
t2=get_time();
printf("(10000~20000)sum2=%d,t2=%f\n",sum2,t2-t1);
return (void*)sum2;
}else if(i==2){
sleep(3);
t1=get_time();
printf("I'm %dth pthread, pthread_id = %lu", i+1, pthread_self());
for( a=20000;a<30000;a++)
sum3=sum3+a;
t2=get_time();
printf("(20000~30000)sum3=%d,t3=%f\n",sum3,t2-t1);
return (void*)sum3;
}else if(i==3){
sleep(4);
t1=get_time();
printf("I'm %dth pthread, pthread_id = %lu", i+1, pthread_self());
for( a=30000;a<40000;a++)
sum4=sum4+a;
t2=get_time();
printf("(30000~40000)sum4=%d,t4=%f\n",sum4,t2-t1);
return (void*)sum4;
}
return NULL;
}
int main(void)
{
pthread_t tid[4]; //定义线程id
int ret,i,sum=0,error;
void *c[4]; //接收传出的值
t1=get_time();
for(i=0;i<4;i++) //创建4个线程
{
ret = pthread_create(&tid[i],NULL,tfn,(void *)i); //将i转换为指针,在tfn中再强转回整形。
if(ret!=0)
{
fprintf(stderr,"phread can't createno%s",strerror(ret));
exit(1);
}
}
for(i=0;i<4;i++) //循环接收传出来的值
{
error=pthread_join(tid[i],&c[i]);
sum+=c[i]; //把传出来的值,给加起来
// printf("sum%d=%d\n",i+1,c[i]); 测试传出的值是否正确
}
t2=get_time();
printf("sum=sum1+sum2+sum3+sum4=%d,t=%fs\n",sum,t2-t1);
sleep(i);//避免退出进程
return 0;
}
运行结果显示:
[root@Tcp more_pthread]# gcc more_pthread.c -o more_pthread -lpthread
more_pthread.c: 在函数‘tfn’中:
more_pthread.c:20: 警告:将一个指针转换为大小不同的整数
more_pthread.c:35: 警告:将一个整数转换为大小不同的指针
more_pthread.c:48: 警告:将一个整数转换为大小不同的指针
more_pthread.c:60: 警告:将一个整数转换为大小不同的指针
more_pthread.c:72: 警告:将一个整数转换为大小不同的指针
more_pthread.c: 在函数‘main’中:
more_pthread.c:86: 警告:将一个整数转换为大小不同的指针
more_pthread.c:90: 警告:隐式声明与内建函数‘exit’不兼容
more_pthread.c:98: 警告:赋值时将指针赋给整数,未作类型转换
[root@Tcp more_pthread]# ./more_pthread
i am 1th pthread,pthread_id= 140375550723840(1~100000)sum1=49995000,t1=0.000147s
i am 2th pthread,pthread_id= 140375540233984(10000~200000)sum2=149995000,t2=0.000032s
i am 3th pthread,pthread_id=140375529744128(20000~30000)sum3=249995000,t3=0.000042s
i am 4th pthread,pthread_id =140375519254272(30000~40000)sum4=349995000,t4=0.000072s
sum = 799980000,t=0.000425s