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);
}
程序运行结果
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下使用两个线程协作完成一个任务的简易实现的更多相关文章
- Linux下c开发 之 线程通信(转)
Linux下c开发 之 线程通信(转) 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linu ...
- Linux下c开发 之 线程通信
Linux下c开发 之 线程通信 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linux本身 ...
- linux下进程的最大线程数、进程最大数、进程打开的文件数
linux下进程的最大线程数.进程最大数.进程打开的文件数 ===========最大线程数============== linux 系统中单个进程的最大线程数有其最大的限制 PTHREAD_TH ...
- Linux下的进程与线程(二)—— 信号
Linux进程之间的通信: 本文主要讨论信号问题. 在Linux下的进程与线程(一)中提到,调度器可以用中断的方式调度进程. 然而,进程是怎么知道自己需要被调度了呢?是内核通过向进程发送信号,进程才得 ...
- Linux 下启动两个tomcat
Linux 下启动两个tomcat 闲来无事学习nginx,想要配置个load balance.可是先决条件是:得有两个web容器.两个电脑是不用想了.只能想办法在一个机器上启动两个tomcat.原以 ...
- Linux下配置两个或多个Tomcat启动
Linux下配置两个或多个Tomcat启动 (2012-08-14 11:59:31) 转载▼ 标签: 杂谈 分类: linux_tomcat 步骤如下: (1)修改/etc/profile文件.添加 ...
- 多线程下,两个线程交替打印0 -100,使用wait()和notify()
多线程下,两个线程交替打印0 -100,使用wait()和notify() public class ThreadTest{ private static final Object lock = ne ...
- rocketmq 两个线程同时消费一个消息
1.问题描述 线上项目A部署两台机器,每台机器两个实例,订阅同一个topic,消费心跳数据. (两台机器host1,host2) 运维同事 部署时 有一个实例用root账户重启的, 然后该实例出现两个 ...
- Linux下查看进程和线程
在linux中查看线程数的三种方法 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行显示一个进程. 2.ps xH 手册 ...
随机推荐
- 笔记9 AOP练习3(通过注解引入新功能 )
切面可以为Spring bean添加新方法. 在Spring中,切面只是实现了它们所包装bean相同接口的 代理.如果除了实现这些接口,代理也能暴露新接口的话,会怎么样 呢?那样的话,切面所通知的be ...
- 5步做一个 TensorFlow 聊天机器人:DeepQA
项目截图: 实测截图: 一步一步教程: 1.下载这个项目: https://github.com/Conchylicultor/DeepQA 2.下载训练好的模型: https://drive.goo ...
- django 发送手机验证码
一.流程分析: 1.用户在项目前端,输入手机号,然后点击[获取验证码],将手机号发到post到后台. 2.后台验证手机号是否合法,是否已被占用,如果通过验证,则生成验证码,并通过运行脚本,让短信运营商 ...
- 学生管理系统(SSM简易版)总结
之前用 Servlet + JSP 实现了一个简易版的学生管理系统,在学习了 SSM 框架之后,我们来对之前写过的项目重构一下! 技术准备 为了完成这个项目,需要掌握如下技术: Java 基础知识 前 ...
- json字符串转json对象,json对象转换成java对象
@RequestMapping(value = "updateInvestorApplyAccountNo", method = RequestMethod.POST) @Resp ...
- 一个成功的 Git 分支模型(适用于商业应用开发)
在这篇文章中,我将推广一下大约一年前我介绍过的一些项目(公私皆有)中使用的开发模型,它们的结果都非常成功.有段时间我非常想写出来分享一下,但是我至今才抽出时间来.我不会言及任何项目细节,仅讨论分支策略 ...
- SVN提交时显示:Path is not a working copy directory
说明你地址没有checkout啊 先checkout,才能add和commi. 要是在一个已有的项目出现这个错误,就是包含这个地址的文件夹没添加进去,去上一层再试一次. 总之,养成在项目根目录提交的习 ...
- 【python标准库模块五】Xml模块学习
Xml模块 xml本身是一种格式规范,是一种包含了数据以及数据说明的文本格式规范.在json没有兴起之前各行各业进行数据交换的时候用的就是这个.目前在金融行业也在广泛在运用. 举个简单的例子,xml是 ...
- Git 常用命令速查表
- About Windows 10 April 2018 Update
在四月的最后一天,微软终于正式发布了 Windows 10 的又一次重大更新,并命名为 Windows 10 四月更新,轮压哨,我软确实谁也不服:再晚一天,我软改名部门恐怕又要发挥作用了,毕竟我软存在 ...