关于linux编程多线程求和

关于linux编程多线程求和

  1. 思路:在创建多个线程,把求和的工作放在每个线程上。再把每个线程求出的和,放回到主线程上进行求和

项目场景:

提示:这里简述项目相关背景:
例如:项目场景:作为刚新手,不知道怎样把返回值线程中返回到主线程。


问题描述:

提示:这里描述项目中遇到的问题:
例如:不知道怎样从线程中返回值!

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


  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值