- 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中查询不到)。只是发送一个
您可能关注的文档
- 文德公司客户关系管理研究概要1.doc
- an_exciting_job_课件概要1.ppt
- 文学类文本阅读之散文阅读2017概要1.ppt
- antonomasia第五组概要1.ppt
- 文小维消费者论文概要1.doc
- AOA二级计算机测评的选择题和判断题概要1.doc
- 农业信息技术精品课结题答辩PPT概要1.ppt
- Antianginal Drugs(抗心绞痛药)概要1.ppt
- AN_INTERVIEW概要1.ppt
- 文旅最强大脑孙博总分享方案概要1.pptx
- 第十一章 电流和电路专题特训二 实物图与电路图的互画 教学设计 2024-2025学年鲁科版物理九年级上册.docx
- 人教版七年级上册信息技术6.3加工音频素材 教学设计.docx
- 5.1自然地理环境的整体性 说课教案 (1).docx
- 4.1 夯实法治基础 教学设计-2023-2024学年统编版九年级道德与法治上册.docx
- 3.1 光的色彩 颜色 电子教案 2023-2024学年苏科版为了八年级上学期.docx
- 小学体育与健康 四年级下册健康教育 教案.docx
- 2024-2025学年初中数学九年级下册北京课改版(2024)教学设计合集.docx
- 2024-2025学年初中科学七年级下册浙教版(2024)教学设计合集.docx
- 2024-2025学年小学信息技术(信息科技)六年级下册浙摄影版(2013)教学设计合集.docx
- 2024-2025学年小学美术二年级下册人美版(常锐伦、欧京海)教学设计合集.docx
文档评论(0)