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

简介: 刚解决了之前的那个Linux下Pthread库的问题,这次就来使用两个线程来协作,共同完成一个求和的任务。打一下基础吧本次需要使用到的知识点有:lpthread,编译的时候用到,相当于一个声明的效果pthread_mutex_t 作为一个锁对象而存在pth...

刚解决了之前的那个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。这样就完成了对其的修改。

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


总结


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

目录
相关文章
|
8天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
26 2
|
1月前
|
缓存 负载均衡 Java
c++写高性能的任务流线程池(万字详解!)
本文介绍了一种高性能的任务流线程池设计,涵盖多种优化机制。首先介绍了Work Steal机制,通过任务偷窃提高资源利用率。接着讨论了优先级任务,使不同优先级的任务得到合理调度。然后提出了缓存机制,通过环形缓存队列提升程序负载能力。Local Thread机制则通过预先创建线程减少创建和销毁线程的开销。Lock Free机制进一步减少了锁的竞争。容量动态调整机制根据任务负载动态调整线程数量。批量处理机制提高了任务处理效率。此外,还介绍了负载均衡、避免等待、预测优化、减少复制等策略。最后,任务组的设计便于管理和复用多任务。整体设计旨在提升线程池的性能和稳定性。
78 5
|
1月前
|
资源调度 Linux 调度
Linux C/C++之线程基础
这篇文章详细介绍了Linux下C/C++线程的基本概念、创建和管理线程的方法,以及线程同步的各种机制,并通过实例代码展示了线程同步技术的应用。
29 0
Linux C/C++之线程基础
|
2月前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
44 5
|
1月前
|
安全 Linux
Linux线程(十一)线程互斥锁-条件变量详解
Linux线程(十一)线程互斥锁-条件变量详解
|
3月前
|
前端开发 JavaScript 大数据
React与Web Workers:开启前端多线程时代的钥匙——深入探索计算密集型任务的优化策略与最佳实践
【8月更文挑战第31天】随着Web应用复杂性的提升,单线程JavaScript已难以胜任高计算量任务。Web Workers通过多线程编程解决了这一问题,使耗时任务独立运行而不阻塞主线程。结合React的组件化与虚拟DOM优势,可将大数据处理等任务交由Web Workers完成,确保UI流畅。最佳实践包括定义清晰接口、加强错误处理及合理评估任务特性。这一结合不仅提升了用户体验,更为前端开发带来多线程时代的全新可能。
80 1
|
3月前
|
监控 数据挖掘 Linux
Linux服务器PBS任务队列作业提交脚本的使用方法
【8月更文挑战第21天】在Linux服务器环境中,PBS任务队列能高效管理及调度计算任务。首先需理解基本概念:作业是在服务器上执行的任务;队列则是等待执行任务的列表,具有不同的资源限制与优先级;节点指分配给作业的计算资源。
513 4
|
3月前
|
存储 监控 Java
|
3月前
|
监控 Linux 调度
在Linux中,如何进行调度任务?什么是 crontab 并解释 crontab 中的字段?
在Linux中,如何进行调度任务?什么是 crontab 并解释 crontab 中的字段?
|
3月前
|
存储 设计模式 NoSQL
Linux线程详解
Linux线程详解
下一篇
无影云桌面