- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
APUE学习Posix线程概要1
?
APUE学习--Posix线程(1)
分类:?Unix环境编程2013-05-27 14:17?85人阅读?评论(0)?收藏?编辑?删除线程(thread)----轻量级的进程、CPU调度的最小单位,相比较于进程,进程是分配资源的最小单位。
之前讲到的是多进程编程,这一部分要说的是如何在一个进程中实现多线程编程(当然将进程部分的内容放到一起,就可以实现多进程多线程编程)。POSIX(可移植性操作系统接口)规定了可移植性的线程库pthread库pthread.h,这里面的函数需要在编译时加上-lpthread(-pthread)参数,pthread库中的类型以及函数是不透明的(掌握如何使用,无须关心如何实现)。
一个进程中至少有一个线程,从main()开始运行的线程称为 主线程(初始线程)。线程id类型pthread_t,可以使用pthread_self()返回,需要注意的是,线程id只是在一个进程内有效(进程id在整个系统中有效);使用pthread_equal()比较两个线程的id是否相等。
[cpp]?view plaincopy
pthread_t?pthread_self(void);??
int?pthread_equal(pthread_t?tid1,?pthread_t?tid2);??
线程创建的创建使用pthread_create()函数:
[cpp]?view plaincopy
int?pthread_create(pthread_t?*tidp,?const?pthread_attr_t?*attr,?void?*(*start_rtn)(void*),?void?*arg);??
函数的第一个参数tidp,是一个出参,用来带回被创建线程的tid;第二个参数attr设置的线程属性(后面说明),默认属性传NULL即可;第三个参数start_rtn是一个函数指针,是被创建线程的入口函数(新线程从该函数开始运行至该函数结束);第四个参数arg是start_rtn函数的参数;该函数调用成功返回0,否则返回出错编码(不使用errno全局变量)。几点需要注意:
1.受OS调度影响,被创建的线程处于就绪状态,故创建线程的线程往往是先被调用。
2.同一进程中的多个线程共享内存资源,故多个线程对进程中的所有变量都是共享的(但要注意该变量的生存期和作用域)。
3.只要进程(主线程)退出,其余未结束的线程都随之结束了(进程结束资源也就没了)
4.同一进程中的多个线程共享文件描述符,并非复制一份。
5.同一进程中的多个线程共享进程的信号屏蔽字,但新线程的未决信号集讲被清空。
进程退出的方式:从start_rtn返回;自身调用pthread_exit()函数;被同一个进程中的其他线程取消。先来看pthread_exit()函数和与之配套的pthread_join()函数:
[cpp]?view plaincopy
void?pthread_exit(void?*rval_ptr);??
int?pthread_join(pthread_t?thread,?void?**rval_ptr);??
pthread_exit()函数类似于进程中的exit()函数,线程直接终止,并将rval_ptr参数作为线程的返回值。pthread_join()的功能类似进程的waitpid(pid)函数,阻塞等待指定的线程退出并接受返回值,参数是void **类型,是一个出参参数。
线程中也有类似进程atexit()注册清理操作的函数,pthread_cleanup_push() pthread_cleanup_pop()注册线程的清理函数。
[cpp]?view plaincopy
void?pthread_cleanup_push(void?(*rtn)(void?*),?void?*arg);??
void?pthread_cleanup_pop(int?execute);??
注册的函数有两个参数,一个是函数指针,一个是该函数接收的参数。第二个函数在执行后会设置之前注册的函数的执行状态,如果execute为0则不执行否则执行,需要注意的是,这两个函数必须是在一个函数内成对出现(具体实现应该是带括号的宏定义),但可以考虑放到pthread_exit()后。再来说下pthread_cancel()函数,它和pthread_exit()都能使一个线程退出,不同是后者是使线程本身退出,而前者是使同一进程中的其他线程退出。
[cpp]?view plaincopy
int?pthread_cancel(pthread_t?tid);??
该函数的原理是:向tid线程发送SIGCANCEL信号(这个信号在kill -l中查询不到)。只是发送一个
您可能关注的文档
最近下载
- 心理健康教育对青少年学习动力的影响.pptx VIP
- 基于财务共享模式下的财务风险管理—以海尔集团为例.doc VIP
- 初一学生期中家长会优质课件.ppt
- 中国华电集团发电运营有限公司招聘笔试题库2024.pdf
- 物流服务师(高级工)职业技能鉴定考试及答案.doc VIP
- 2024年浙江省中考数学试卷(附答案).pdf
- 人教版九年级全册英语Unit 14大单元整体教学设计.docx
- 4.11.1《探问人生目标》课件人教统编版道德与法治七年级上册2024新教材.pptx
- JB∕T 10923-2020 电能表用磁保持继电器.pdf
- 2018年版《广东省安装工程定额说明及计算规则》C.5 建筑智能化工程.pdf
文档评论(0)