linux 多线程和同步机制的使用.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
linux 多线程和同步机制的使用

linux 多线程和同步机制的使用 /blog/static/9224483200781041684/ ? 最近正在尝试写一个脚本解析器, 其中有的地方要考虑多线程的并发,所以找了个多线程库的实现来看(linuxthreads,虽然已经被NPTL取代,但是在linuxthreads里 可以看到很多原汁原味的概念,选择linuxthreads还有一个原因是我找不到pthread实现的独立包,也不想从glibc中自己分离 pthread的实现部分^_^),在看源码前,这里先看看pthread的接口说明(这里大部分的描述都是基于POSIX标准的,但是 linuxpthreads很多地方却不遵守POSIX,所以源码和这里的描述可能会有一定的差异),就作为熟悉一下POSIX的多线程模型吧 (linuxthreads的分析请参考我的另一篇blog(整理中^_^))。 1、linux内核对线程的支持实质 ?? linux内核中没有专门针对线程的接口,在内核看来线程是一个轻量级的进程,也就是说创建线程和创建进程最后调用的都是创建进程的内核接口do_fork(...)。 ? 2、线程的取消点 ????? 取消点是针对函数来说的,表示当一个线程调用这个(多数是阻塞的)函数在调用的过程中,如果别的线程给这个线程发送了cannel信号,这个线程是否直接 从这个里退出,而不从函数返回。很多不是取消点阻塞的调用会由于cancel信号而返回,从而使程序重新得到控制权继续运行,同时设置错误号为 (error = EINTR),直到遇到取消点才会退出。(为了使取消点模式有效,需要设置线程的退出方式为PTHREAD_CANCEL_DEFERED,且允许取消点 PTHREAD_CANCEL_ENABLE) ????? 取消点的存在是为了使开发者有机会释放不再由于线程的退出而不再有用的资源或者通知其他的工作线程等。 ????? 取消点包括:pthread_testcancel、pthread_cond_wait、pthread_cond_timedwait、 pthread_join、sigwait和标志库中的一些会引起阻塞的系统调用(如:read/write等,不过有的linux平台的标准库并没有实 现取消点的功能,而使通过error=EINTR的方式将阻塞的系统调用返回到控制程序中) ? ? 3、libpthread的使用 ?? libpthread库分为thread、mutext、condvar、semaphore、rwlock几个部分,现在分别来看一下它们的API ?? 3.1、 thread的API ???? 创建线程 ???? int? pthread_create(pthread_t? *? thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg) ???? thread是一个指向线程结构的指针,在后续的线程函数调用中都需要它 ???? pthread_attr_t是控制线程属性的结构: ???? typedef struct __pthread_attr_s ??? { ????? int __detachstate; 设置线程是否和其他线程同步(其他线程能否调用pthread_join),也可以在新线程运行中调 用pthread_detach完成 默认值是PTHREAD_CREATE_JOINABLE ? PTHREAD_CREATE_DETACH),detach后线程的资源在退出后自行释放。 int __schedpolicy; 线程的调度策略,可以用pthread_setschedparam设置,有效值为SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮转法)和SCHED_FIFO(实时、先入先出)struct __sched_param __schedparam; 调度参数,现在只有sched_priority一个成员,表示线程的优先级,只在调度策略为SCHED_RR或SCHED_FIFO有效int __inheritsched; 设置是否继承创建者的调度相关参数,默认是PTHREAD_EXPLICIT_SCHED,即按照attr的参数指定int __scope; CPU时间的竞争方式,posix支持两种:PTHREAD_SCOPE_SYSTEM、PTHREAD_SCOPE_PROCESS(linuxthreads只实现了PTHREAD_SCOPE_SYSTEM)。size_t __guardsize; ????? int __stackaddr_set; ????? void *__stackaddr; ????? size_t

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档