文档介绍:踏雪无痕
【Linux的高级应用编程】Linux下的多线程编程
分类: Linux C++ 2011-11-25 16:56 196人阅读评论(0) 收藏举报
 
Linux下的多线程编程
Sailor_forever  sailing_9806@ 转载请注明
http://blog./sailor_8318/archive/2009/02/07/
 
 
1       线程创建与取消
    线程创建
      线程与进程
相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空
间,拥有独立的执行序列。在串行程序基础上引入线程和进程是为了提高程序的并发度,从而提高程序运行效率和
响应时间。
 
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合
于在SMP机器上运行,而进程则可以跨机器迁移。
 
      创建线程
POSIX通过pthread_create()函数创建线程,API定义如下:
int  pthread_create(pthread_t  *  thread, pthread_attr_t * attr,
void * (*start_routine)(void *), void * arg)
与fork()调用创建一个进程的方法不同,pthread_create()创建的线程并不具备与主线程(即调用
pthread_create()的线程)同样的执行序列,而是使其运行start_routine(arg)函数。thread返回创建的线程ID,
而attr是创建线程时设置的线程属性。pthread_create()的返回值表示线程创建是否成功。尽管arg是void *类型的
变量,但它同样可以作为任意类型的参数传给start_routine()函数;同时,start_routine()可以返回一个void *
类型的返回值,而这个返回值也可以是其他类型,并由pthread_join()获取。
 
      线程创建属性
pthread_create()中的attr参数是一个结构指针,结构中的元素分别对应着新线程的运行属性,主要包括以下几
项:
__detachstate,表示新线程是否与进程中其他线程脱离同步,如果置位则新线程不能用pthread_join()来同步,且
在退出时自行释放所占用的资源。缺省为PTHREAD_CREATE_JOINABLE状态。
 
__schedpolicy,表示新线程的调度策略,主要包括SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮转法)和
SCHED_FIFO(实时、先入先出)三种,缺省为SCHED_OTHER,后两种调度策略仅对超级用户有效。运行时可以用过
pthread_setschedparam()来改变。
__schedparam,一个struct sched_param结构,目前仅有一个sched_priority整型变量表示线程的运行优先级。这
个参数仅当调度策略为实时(即SCHED_RR或SCHED