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

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

打一下基础吧

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

lpthread,编译的时候用到,相当于一个声明的效果

pthread_mutex_t 作为一个锁对象而存在

pthread_create,创建一个新线程的函数调用

pthread_t ,线程的类型

代码展示

#include

#include

//多线程库的引用

#include

//分别用于记录总和和线程的数目

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\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。这样就完成了对其的修改。

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

总结

额,我这里完成的多线程的交互,并不是最标准的,甚至可以认为是“挫”。但是主要的思想还是比较的正统的。实际的开发中,需要很多方面的配合才能更好的作出多线程的协作或者交互任务。

毕竟是刚接触这方面的知识,代码中不可避免的会存在一些问题。欢迎博友们批评指正,希望能和你们共同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值