Linux下使用两个线程协作完成一个任务的简易实现

                       

刚解决了之前的那个Linux下Pthread库的问题,这次就来使用两个线程来协作,共同完成一个求和的任务。


打一下基础吧


本次需要使用到的知识点有:

  • lpthread,编译的时候用到,相当于一个声明的效果
  • pthread_mutex_t 作为一个锁对象而存在
  • pthread_create,创建一个新线程的函数调用
  • pthread_t ,线程的类型

代码展示


#include <stdio.h>#include <stdlib.h>//多线程库的引用#include<pthread.h>//分别用于记录总和和线程的数目int sum  ,count;//用于对线程的入口函数进行加锁操作的变量pthread_mutex_t lockid;//线程的入口函数void* runner(void *param);int main( int argc, char*argv[]){    //声明两个线程    pthread_t tid , tid2;    pthread_attr_t attr;    if(argc != 2){        fprintf(stderr,"usage : a.out<integer value>\n");        return -1;    }    if(atoi(argv[1])<0){        fprintf(stderr,"%d must be >= 0 \n",atoi(argv[1]));        return -1;    }    pthread_attr_init(&attr);    //创建两个线程    pthread_create(&tid,&attr,runner,argv[1]);    pthread_create(&tid2,&attr,runner,argv[1]);    //等待两个线程的结束。才唤醒主函数    pthread_join(tid,NULL);    pthread_join(tid2,NULL);    //输出最后的总的计算的结果    printf("Sum = :%d\n",sum);}void* runner(void *param){    int i , upper = atoi(param);    pthread_mutex_lock(&lockid);    count += 1;    printf("正在执行第%d个线程的求和运算:\n",count);    if(count == 1){        for(i = 1; i < upper/2 ; i++){            sum += i ;        }    }else if(count ==2 ){        for(i = upper/2; i < upper ; i++){            sum += i ;        }    }else{        printf("对不起,目前只支持两个线程了!\n");    }    printf("第%d个线程的运算结果是:%d\t\n",count,sum);    pthread_mutex_unlock(&lockid);    pthread_exit(0);}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

程序运行结果


mark@mark-pc:~/Code/C/PThreadTest$ gcc  main.c  -lpthread  -o Mainmark@mark-pc:~/Code/C/PThreadTest$ ./Main 100正在执行第1个线程的求和运算:第1个线程的运算结果是:1225    正在执行第2个线程的求和运算:第2个线程的运算结果是:4950    Sum = :4950
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

细节分析


下面我来说一说此段代码的核心。
首先,是创建线程之前做的一些“异常”处理,不是最重要的,但是也不可缺少。就是对参数的判断罢了。

然后,是创建线程的四个参数的具体的含义。分别是引用的线程的id,属性的引用,线程的入口函数的名称,以及要传进线程的方法的参数。
注意这里是引用类型的线程id。找出就在于可以把创建线程的结果返回给线程id。这样就完成了对其的修改。

最后,在线程的入口函数里面,我对相关项进行了处理。包括判断线程,加锁,解锁等操作。当这两个线程都执行完成的时候,唤醒主函数(可以认为是“进程”)。完成最后的输出任务!


总结


额,我这里完成的多线程的交互,并不是最标准的,甚至可以认为是“挫”。但是主要的思想还是比较的正统的。实际的开发中,需要很多方面的配合才能更好的作出多线程的协作或者交互任务。
毕竟是刚接触这方面的知识,代码中不可避免的会存在一些问题。欢迎博友们批评指正,希望能和你们共同进步!

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值