位置: 编程技术 - 正文

Linux 多线程编程实例(linux多线程编程电子书)

编辑:rootadmin

推荐整理分享Linux 多线程编程实例(linux多线程编程电子书),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:linux多线程编程电子书,linux多线程编程实验,linux多线程编程实例,linux多线程编程的书,linux 多线程编程解决资源竞争问题,linux多线程编程实验,linux多线程编程实例,linux 多线程编程解决资源竞争问题,内容如对您有帮助,希望把文章链接给更多的朋友!

一、多线程 VS 多进程

和进程相比,线程有很多优势。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护代码段和数据。而运行于一个进程中的多个线程,他们之间使用相同的地址空间。正是这样,同一进程下的线程之间共享数据空间,数据可以相互使用,并且线程间切换也要更快些,可以更有效的利用CPU。

二、程序设计

[注] 头文件<pthread.h> 编译时要加载动态库 libpthread.a,使用 -lpthread 1、创建线程2、等待线程3、关闭线程4、退出清除 1、创建线程复制代码代码如下: int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, void *(*start_rtn)(void), void *arg)tidp为线程id,是函数分配的值,所以要传一个 pthread_t 的地址。attr线程属性,通常为空。start_rtn为线程要执行的函数,返回值为空指针,参数为后面的*arg若成功则返回0,否则返回出错编号。 例:

复制代码代码如下:#include<stdio.h>#include<pthread.h></p><p>void *func1(void *arg){ //原函数声明 int i; for(i=0;i<5;i++){ printf("this is func1! The num is %dn",*(int*)arg); //将空指针转换为int型指针 sleep(1); }}</p><p>void *func2(int *m){ //自定义类型声明,也可以定义非指针类型,但是在create时会有警告,因为非地址并不能改变传入的值 int i; for(i=0;i<5;i++){ printf("this is func2! The num is %dn",*m); (*m)++; sleep(1); }}</p><p>int main(){ pthread_t id1,id2; int num = 5; int *p = &num; if(pthread_create(&id1,NULL,(void *)func1,(void *)p) != 0){ printf("thread1 create error!n"); return -1; } if(pthread_create(&id2,NULL,(void *)func2,&num) != 0){ printf("thread2 create error!n"); return -1; } pthread_join(id1,NULL); //等待线程结束 pthread_join(id2,NULL); printf("Running complete!n"); return 0;</p><p>}

运行结果:

复制代码代码如下:[fsy@localhost process]$ gcc thC.c -o thC -lpthread -g[fsy@localhost process]$ ./thCthis is func2! The num is 5this is func1! The num is 6this is func2! The num is 6this is func1! The num is 7this is func2! The num is 7this is func1! The num is 8this is func2! The num is 8this is func1! The num is 9this is func2! The num is 9this is func1! The num is Running complete![fsy@localhost process]$

Linux 多线程编程实例(linux多线程编程电子书)

2、等待线程

[注]当调用pthread_create函数时,线程并没有开始执行,主进程应有等待,比如用sleep,或者用更专业的函数:pthread_join复制代码代码如下: int pthread_join(pthread_t tid, void **rval_ptr) 调用函数可以阻塞调用线程,直到指定的线程终止。tid为等待退出线程的id,rval_ptr为函数的返回值。是指向指针的指针,可以置空。 例:复制代码代码如下:#include<stdio.h>#include<pthread.h>#include<stdlib.h></p><p>void *func(int *p){ int *num=(int *)malloc(sizeof(int)); //必须动态创建,原因可以参考我动态分配内存的博客 printf("Please input the number: "); scanf("%d",num); return (void *)num; //类型是pthread_create的参数规定的}</p><p>int main(){ pthread_t pth; void *a; if(pthread_create(&pth,NULL,(void *)func,NULL) != 0){ printf("create thread error!n"); return 1; } pthread_join(pth,&a); //指向空指针的指针 printf("get the num from the thread, it's %dn",*(int *)a); return 0;}

3、终止线程

线程终止有以下三种方式:

1、线程从函数中返回2、线程可以别其他函数终止3、线程自己调用pthread_exit函数复制代码代码如下:void pthread_exit(void *rval_ptr)rval_ptr为线程退出返回值的指针,即函数返回值。

4、退出清除复制代码代码如下: void pthread_cleanup_push(void (*rtn)(void*), void *arg)rtn为清除函数,arg是清除函数的参数复制代码代码如下:void pthread_cleanup_pop(int execute)当execute 非0时执行清除函数。为0时不执行。

从pthread_cleanup_push的调用点到pthread_cleanup_pop之间的程序段中,如果有终止进程的动作,如调用pthread_exit或异常终止(不包括return),就会执行pthread_cleanup_push()所指定的清理函数。多个嵌套匹配时,就近匹配。 例:复制代码代码如下:#include<stdio.h>#include<pthread.h></p><p>void *clean(char *argv){ printf("clean is called by %sn",argv); return NULL;}void *func1(void *argv){ printf("welcome enter the func1!n"); pthread_cleanup_push((void*)clean,"the first time call!"); pthread_cleanup_push((void*)clean,"the second time call!"); if(argv){ return (void *)1; //第二次运行将此句注掉 } pthread_cleanup_pop(0); pthread_cleanup_pop(1); return (void *)0;}</p><p>void *func2(void *argv){ sleep(1); //两个线程运行先后不确定 printf("welcome enter the func2!n"); pthread_cleanup_push((void*)clean,"the first time call!"); pthread_cleanup_push((void*)clean,"the second time call!"); if(argv){ pthread_exit(NULL); } pthread_cleanup_pop(0); pthread_cleanup_pop(0); return (void *)0;}</p><p>int main(){ pthread_t tid1,tid2; if(pthread_create(&tid1,NULL,(void *)func1,(void *)1) != 0){ printf("thread1 create error!n"); return 1; }</p><p> if(pthread_create(&tid2,NULL,(void *)func2,(void *)1) != 0){ printf("thread2 create error!n"); return 1; } pthread_join(tid1,NULL); pthread_join(tid2,NULL); return 0;}

运行结果:复制代码代码如下:[fsy@localhost process]$ gcc thClean.c -o thclean -lpthread[fsy@localhost process]$ ./thcleanwelcome enter the func1!welcome enter the func2!clean is called by the second time call! //此处先2后1clean is called by the first time call![fsy@localhost process]$ vim thClean.c[fsy@localhost process]$ gcc thClean.c -o thclean -lpthread[fsy@localhost process]$ ./thcleanwelcome enter the func1!clean is called by the first time call! //second已经被popwelcome enter the func2!clean is called by the second time call!clean is called by the first time call![fsy@localhost process]$

Linux消息队列编程示例 一、概念消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向中按照一定

Percona Server 5.5.-.3/5.6.-.0 发布 PerconaServer5.5.-.3发布,此版本基于MySQL5.5.,包括其所有bug修复,是当前5.5系列最新的稳定版本。此版本现已提供下载,也提供在PerconaSoftwareRepositories

Linux iptables的备份和恢复操作详解 1、iptables的配置文件位置:/etc/sysconfig/iptables主控机:即业务运行中的机子;备份机:即主控机故障时,切换到备份的机子--在主控机上的操作-------------

标签: linux多线程编程电子书

本文链接地址:https://www.jiuchutong.com/biancheng/364796.html 转载请保留说明!

上一篇:Linux共享内存编程示例(linux共享内存同步机制)

下一篇:Linux消息队列编程示例(linux消息队列阻塞)

  • 科普一下发票知识
  • 工商年报多久能显示
  • 一般纳税人可以开1%的发票吗
  • 经营用的电饭锅有哪些
  • 企业所得税计算例题
  • 免征企业所得税的有
  • 小规模纳税人开票税率
  • 差旅费报销单是外来原始凭证吗
  • 外地施工如何找工人
  • 土地以租代卖,违法吗
  • 回购股份限售
  • 有限合伙合伙人要求
  • 子公司的财报和母公司的财报并表吗
  • 服务费增值税专用发票税点
  • 出口预收货款发生的时间和报表上的时间不一样怎么办
  • 委托贷款利息收入账务处理
  • 购买电脑配件的网址
  • 库存半成品属于什么会计科目
  • 租给公司仓库要发票怎么办
  • 月底结转应交税费怎么弄
  • 职工报销差旅费会计科目
  • 一般纳税人能用小企业会计准则吗
  • 4s店付款
  • 联营店铺收取的收入如何账务处理?
  • 六月工资七月发算不算压工资
  • 房租费属于无形资产吗
  • 个税退手续费要多久到账
  • 电子税务局发送短信异常是怎么回事
  • 政府会计制度新旧衔接图
  • 残保金按计提数还是按发放数申报
  • 如何在win7系统中查看电脑基本信息
  • win10无法以管理员身份运行的原因及解决方法
  • 存出投资款要计入现金流吗
  • linux系统已经得到了广泛的应用
  • 股东借款给公司会计分录
  • 结转损益类收入账户的余额会计分录
  • 二手固定资产怎么折旧
  • php yield 异步
  • 南极岛在哪
  • php共享内存用法有哪些
  • 什么是重大会计事务所
  • laravel 关联
  • ubuntu16.04.4安装教程
  • 刚购入的固定资产怎么算
  • 免费开源的图片app
  • nodejs 下载
  • php数学
  • 销售费用占销售成本比例
  • 个人所得税经营所得税申报表A表
  • 帝国cms使用手册
  • 物业公司电费最多可以收多少钱一度
  • 已经抵扣的进项税额转出会计分录
  • 一般纳税人接受的下列服务中不得抵扣进项税额的有
  • sqlserver2000分页
  • linux中备份
  • 不动产租赁服务包括哪些
  • 财政补助收入的账务处理
  • 小规模结转成本怎么计算
  • 统一机构信用代码最后一位校验码
  • 典当行收房产证吗直接可以拿钱吗
  • 为什么要缴纳残保金
  • 工程没钱也没有工资
  • 删除用户mysql
  • win7开机taskeng
  • win10系统如何关闭窗口特效
  • mac快捷键使用
  • linux硬件设备分为
  • speedmgr.exe - speedmgr是什么进程 有什么用
  • macos unity
  • js定时器的两种方法
  • 字符串反转C语言代码
  • 用python的turtle画图代码
  • python做排序
  • bash: /usr/bin/autocrorder: /usr/bin/python^M: bad interpreter: No such file or directory
  • jquery 图片插件
  • android布局有哪些,它们的作用分别是?
  • 电子办税服务厅怎么开电子发票
  • 中国税务报优秀文学作品年度评选
  • 电子税务局第一次申请发票流程
  • 临时工和季节工需要交社保吗合法吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设