Linux多线程题库.doc
文本预览下载声明
LINUX多线程
课程内容 linux下的多线程库介绍,多线程的创建与终止,多线程的控制,多线程的同步与互斥。
目 录
1. Linux多线程概述 1
1.1. 概述 1
1.2. 线程创建的Linux实现 2
2. 线程的创建 2
3. 线程的终止 3
3.1. 线程正常终止 3
3.2. 线程的取消 5
3.3. 线程终止清理函数 5
4. 线程的同步与互斥 7
4.1. 线程的互斥 7
4.2. 线程的同步 11
Linux多线程概述
概述
相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。同多进程一样,多线程程序并不能真正提高程序的运行速度。在实际应用中,多线程通常仅仅是为了方便程序设计,具体的说,通常是用于有阻塞调用的场合,比如io的read,socket的recv等,以提高响应速度。
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。从可移植性来讲,多进程的可移植性要好些 。
线程创建的Linux实现
Linux的线程是通过用户级的函数库实现的,内核提供的是创建进程的接口do_fork()。内核提供了两个系统调用__clone()和fork(),最终都用不同的参数调用do_fork()。当然,要想实现线程,没有核心对多进程(其实是轻量级进程)共享数据段的支持是不行的,因此,do_fork()提供了很多参数,包括CLONE_VM(共享内存空间)、CLONE_FS(共享文件系统信息)、CLONE_FILES(共享文件描述符表)、CLONE_SIGHAND(共享信号句柄表)和CLONE_PID(共享进程ID,仅对核内进程,即0号进程有效)。当使用fork系统调用时,内核调用do_fork()不使用任何共享属性,进程拥有独立的运行环境,而使用pthread_create()来创建线程时,则最终设置了所有这些属性来调用__clone(),而这些参数又全部传给核内的do_fork(),从而创建的进程拥有共享的运行环境,只有栈是独立的,由__clone()传入。
按通俗的话讲,Linux线程就是轻量级的进程。
线程的创建
函数原型:
#include pthread.h
int pthread_create( pthread_t * thread,
pthread_attr_t * attr,
void *(*start_routine)(void *),
void * arg);
thread是传出参数,保存新线程的标识;
attr是一个结构体指针,结构中的元素分别指定新线程的运行属性,各成员属性为:
__detachstate,表示新线程是否与进程中其他线程脱离同步,如果置位则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为PTHREAD_CREATE_JOINABLE状态。这个属性也可以在线程创建并运行以后用pthread_detach()来设置,而一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到PTHREAD_CREATE_JOINABLE状态。
__schedpolicy,表示新线程的调度策略,主要包括SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮转法)和SCHED_FIFO(实时、先入先出)三种,缺省为SCHED_OTHER,后两种调度策略仅对超级用户有效。运行时可以用过pthread_setschedparam()来改变。
__schedparam,一个sched_param结构,目前仅有一个sched_priority整型变量表示线程的运行优先级。这个参数仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0。
__inheritsched,有两种值可供选择:PTHREAD_EXPLICIT_SCHED和PTHREAD_INHERIT_SCHED,前者表示新线程使用显式指定调度策略和调度参数(即attr中的值),而后者表示继承调用者线程的值。缺省为PTHREAD_EXPLICIT_SCHED。
__scope,表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。POSIX的标准中定义了两个值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。目前Linux仅实现了PTHREAD_SCOPE_SYSTEM一值
显示全部