欢迎来到天天文库
浏览记录
ID:41032471
大小:72.00 KB
页数:22页
时间:2019-08-14
《Posix线程编程指南》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Subject:[精华]转贴:pthread解读(一)Author:hyl Posted:2002-06-1813:59 Length:7,014byte(s)Posix线程编程指南(1)内容:一、线程创建二、线程取消关于作者线程创建与取消杨沙洲(pubb@163.net)2001年10月这是一个关于Posix线程编程的专栏。作者在阐明概念的基础上,将向您详细讲述Posix线程库API。本文是第一篇将向您讲述线程的创建与取消。一、线程创建1.1线程与进程相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他
2、线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。在串行程序基础上引入线程和进程是为了提高程序的并发度,从而提高程序运行效率和响应时间。线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。1.2创建线程POSIX通过pthread_create()函数创建线程,API定义如下:intpthread_create(pthread_t*thread,pthread_attr_t*attr,void*(*start_routine)(v
3、oid*),void*arg)与fork()调用创建一个进程的方法不同,pthread_create()创建的线程并不具备与主线程(即调用pthread_create()的线程)同样的执行序列,而是使其运行start_routine(arg)函数。thread返回创建的线程ID,而attr是创建线程时设置的线程属性(见下)。pthread_create()的返回值表示线程创建是否成功。尽管arg是void*类型的变量,但它同样可以作为任意类型的参数传给start_routine()函数;同时,start_routine()可以
4、返回一个void*类型的返回值,而这个返回值也可以是其他类型,并由pthread_join()获取。1.3线程创建属性pthread_create()中的attr参数是一个结构指针,结构中的元素分别对应着新线程的运行属性,主要包括以下几项:__detachstate,表示新线程是否与进程中其他线程脱离同步,如果置位则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为PTHREAD_CREATE_JOINABLE状态。这个属性也可以在线程创建并运行以后用pthread_detach()来设置,
5、而一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到PTHREAD_CREATE_JOINABLE状态。__schedpolicy,表示新线程的调度策略,主要包括SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮转法)和SCHED_FIFO(实时、先入先出)三种,缺省为SCHED_OTHER,后两种调度策略仅对超级用户有效。运行时可以用过pthread_setschedparam()来改变。__schedparam,一个structsched_param结构
6、,目前仅有一个sched_priority整型变量表示线程的运行优先级。这个参数仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0。__inheritsched,有两种值可供选择:PTHREAD_EXPLICIT_SCHED和PTHREAD_INHERIT_SCHED,前者表示新线程使用显式指定调度策略和调度参数(即attr中的值),而后者表示继承调用者线程的值。缺省为PTHREAD_EXPLICIT_SCHED。__sc
7、ope,表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。POSIX的标准中定义了两个值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。目前LinuxThreads仅实现了PTHREAD_SCOPE_SYSTEM一值。pthread_attr_t结构中还有一些值,但不使用pthread_create()来设置。为了设置这些属性,POSIX定义了一系列属性设置函数,包括pthread_attr_ini
8、t()、pthread_attr_destroy()和与各个属性相关的pthread_attr_get---/pthread_attr_set---函数。1.4线程创建的Linux实现我们知道,Linux的线程实现是在核外进行的,核内提供的是创建进程的接口do_fork()。
此文档下载收益归作者所有