刚解决了之前的那个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下使用两个线程协作完成一个任务的简易实现的更多相关文章

  1. Linux下c开发 之 线程通信(转)

    Linux下c开发 之 线程通信(转) 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linu ...

  2. Linux下c开发 之 线程通信

    Linux下c开发 之 线程通信 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linux本身 ...

  3. linux下进程的最大线程数、进程最大数、进程打开的文件数

    linux下进程的最大线程数.进程最大数.进程打开的文件数   ===========最大线程数============== linux 系统中单个进程的最大线程数有其最大的限制 PTHREAD_TH ...

  4. Linux下的进程与线程(二)—— 信号

    Linux进程之间的通信: 本文主要讨论信号问题. 在Linux下的进程与线程(一)中提到,调度器可以用中断的方式调度进程. 然而,进程是怎么知道自己需要被调度了呢?是内核通过向进程发送信号,进程才得 ...

  5. Linux 下启动两个tomcat

    Linux 下启动两个tomcat 闲来无事学习nginx,想要配置个load balance.可是先决条件是:得有两个web容器.两个电脑是不用想了.只能想办法在一个机器上启动两个tomcat.原以 ...

  6. Linux下配置两个或多个Tomcat启动

    Linux下配置两个或多个Tomcat启动 (2012-08-14 11:59:31) 转载▼ 标签: 杂谈 分类: linux_tomcat 步骤如下: (1)修改/etc/profile文件.添加 ...

  7. 多线程下,两个线程交替打印0 -100,使用wait()和notify()

    多线程下,两个线程交替打印0 -100,使用wait()和notify() public class ThreadTest{ private static final Object lock = ne ...

  8. rocketmq 两个线程同时消费一个消息

    1.问题描述 线上项目A部署两台机器,每台机器两个实例,订阅同一个topic,消费心跳数据. (两台机器host1,host2) 运维同事 部署时 有一个实例用root账户重启的, 然后该实例出现两个 ...

  9. Linux下查看进程和线程

    在linux中查看线程数的三种方法 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行显示一个进程. 2.ps xH 手册 ...

随机推荐

  1. linux设置oracle自动启动

    用root用户 在/etc/init.d/目录下创建Oracle的服务文件 cd /etc/init.d vi oracle11g   添加内容如下   #!/bin/bash # chkconfig ...

  2. gulp将多张小图自动合成雪碧图

    最近一直在做移动端的改版项目,做之前老大就跟我说了好几次,说这次改版一定要用雪碧图减少一个页面的图片的请求次数,能加快页面的加载速度就一定要加快,我说可以.因为之前的项目开发时间过短,也没有时间去慢慢 ...

  3. 4月18开始看《C++Primer Plus》

    好久没有写博客了,之前也说过水平有限,也写不出什么技术博客,只能写些感悟. 过年之后,陆续做了2.3个项目,刚开始可能不太熟悉流程,怎么和页面传数据?最近一个项目1/2天就写完代码了,真的很简单,主要 ...

  4. angularJS入门笔记

    1.debug调试工具:batarang2.ng指令 1.ng-app=" " 定义angularJS的使用范围:----main方法,入口 ng-app="myModu ...

  5. git报错:'fatal:remote origin already exists

    git报错:'fatal:remote origin already exists'怎么处理?附上git常用操作以及说明.   git添加远程库的时候有可能出现如下的错误, 怎么解决? 只要两步: 1 ...

  6. 数据结构之堆Heap

    1. 概述 堆(也叫优先队列),是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆).它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等. 2. 堆 ...

  7. setTimeout、setInterval被遗忘的第三个参数

    一.最近在看promise,惊奇的发现:原来 setTimeout不只有两个参数,我还能说什么呢?赶紧探探究竟. function multiply(input) { return new Promi ...

  8. Java阻塞队列的实现

    阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞.试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列 ...

  9. C# IE浏览器

    引用Microsoft HTML Object Library 引用 -> com -> Microsoft HTML Object Library 引用后,显示如图 1.判断ie浏览器是 ...

  10. php闭包类外操作私有属性

    Closure::bind() Closure::bindTo(); class person{ private $age; private $sex; public function __const ...