APUE学习Posix线程概要1.doc

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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中查询不到)。只是发送一个

文档评论(0)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档