Linux下使用两个线程协作完成一个任务的简易实现
2016-03-21 11:49
387 查看
刚解决了之前的那个Linux下Pthread库的问题,这次就来使用两个线程来协作,共同完成一个求和的任务。
lpthread,编译的时候用到,相当于一个声明的效果
pthread_mutex_t 作为一个锁对象而存在
pthread_create,创建一个新线程的函数调用
pthread_t ,线程的类型
首先,是创建线程之前做的一些“异常”处理,不是最重要的,但是也不可缺少。就是对参数的判断罢了。
然后,是创建线程的四个参数的具体的含义。分别是引用的线程的id,属性的引用,线程的入口函数的名称,以及要传进线程的方法的参数。
注意这里是引用类型的线程id。找出就在于可以把创建线程的结果返回给线程id。这样就完成了对其的修改。
最后,在线程的入口函数里面,我对相关项进行了处理。包括判断线程,加锁,解锁等操作。当这两个线程都执行完成的时候,唤醒主函数(可以认为是“进程”)。完成最后的输出任务!
毕竟是刚接触这方面的知识,代码中不可避免的会存在一些问题。欢迎博友们批评指正,希望能和你们共同进步!
打一下基础吧
本次需要使用到的知识点有: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); }
程序运行结果
mark@mark-pc:~/Code/C/PThreadTest$ gcc main.c -lpthread -o Main mark@mark-pc:~/Code/C/PThreadTest$ ./Main 100 正在执行第1个线程的求和运算: 第1个线程的运算结果是:1225 正在执行第2个线程的求和运算: 第2个线程的运算结果是:4950 Sum = :4950
细节分析
下面我来说一说此段代码的核心。首先,是创建线程之前做的一些“异常”处理,不是最重要的,但是也不可缺少。就是对参数的判断罢了。
然后,是创建线程的四个参数的具体的含义。分别是引用的线程的id,属性的引用,线程的入口函数的名称,以及要传进线程的方法的参数。
注意这里是引用类型的线程id。找出就在于可以把创建线程的结果返回给线程id。这样就完成了对其的修改。
最后,在线程的入口函数里面,我对相关项进行了处理。包括判断线程,加锁,解锁等操作。当这两个线程都执行完成的时候,唤醒主函数(可以认为是“进程”)。完成最后的输出任务!
总结
额,我这里完成的多线程的交互,并不是最标准的,甚至可以认为是“挫”。但是主要的思想还是比较的正统的。实际的开发中,需要很多方面的配合才能更好的作出多线程的协作或者交互任务。毕竟是刚接触这方面的知识,代码中不可避免的会存在一些问题。欢迎博友们批评指正,希望能和你们共同进步!
相关文章推荐
- Linux下使用两个线程协作完成一个任务的简易实现
- centos下对硬盘进行分区和格式化为指定的文件系统
- Linux内核分析作业第五周
- linux grep (linux查找关键字在php出现的次数)
- 本地如何无密码登录linux服务器
- Linux 安装性能监控检测工具sysstat
- linux --> 获取系统启动时间
- CentOS 配置 amp
- 在Linux中使用线程
- linux --> 获取进程执行时间
- CentOS本地yum源
- centos fcitx 安装 配置 详解
- Linux并发(异步信号)
- linux性能监控-cpu,memory,IO,Network
- CentOS上 svn客户端的安装及应用
- linux --> fork()详解
- Linux文件或目录的读,写,执行权限
- Linux服务器沦陷为肉鸡的全过程实录
- Linux 杂记
- 一、Linux文件权限