linux c 笔记 线程控制(一)

线程
线程是计算机中独立运行的最小单位,运行时占用很少的系统资源,由于每个线程占用的cpu时间是由系统分配的,因此可以把线程看成是系统分配cpu 时间的基本单位,在于用户看来,多个线程是交替执行的,系统不停的在各个线程之间切换,每个线程只有在系统分配给他的时间片内才能取得cpu的控制权,执行线程中的代码

线程的优点:节约,节约资源,节省时间,提高应用程序的响应速度,可以提高多处理器的效率,可以改善程序的结构

线程也有很多私有数据:线程号,寄存器,堆栈,信号掩码,优先级,线程私有的存储空间

一.创建线程 pthread_create函数
#include<pthread.h> 
int pthread_create ( pthread_t  *thread,const  pthread_attr_t   *attr,  (void*)(*start_routine)(void*)  ,void *arg);

 

第一个参数为指向线程标识符的指针,当线程创建成功的时候,用来返回创建线程的id 。
第二个参数用来设置线程属性,NULL表示默认的属性。
第三个参数是线程运行函数的起始地址,该参数是一个函数指针,指向线程创建后要调用的函数,这个被线程调用的函数也称为线程函数。
最后一个参数指向传递给线程函数的参数。

创建成功时,函数返回0,由thread指向的内存单元被设置为新创建线程的线程ID。attr参数用于指定各种不同的线程属性。新创建的线程从start_routine函数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_routine函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。
linux下用C语言开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。
由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由 restrict 修饰的指针表达式中。 由 restrict 修饰的指针主要用于函数形参,或指向由 malloc() 分配的内存空间。restrict 数据类型不改变程序的语义。 编译器能通过作出 restrict 修饰的指针是存取对象的唯一方法的假设,更好地优化某些类型的例程。

二.线程属性
创建函数pthread_create有一个参数的类型为pthread_attr_t,该结构体定义如下
typedef struct
              {
                       int                                  detachstate;         线程的分离状态
                       int                                  schedpolicy;      线程调度策略
                       struct sched_param           schedparam;     线程的调度参数
                       int                                  inheritsched;        线程的继承性
                       int                             scope;               线程的作用域
                       size_t                            guardsize;       线程栈末尾的警戒缓冲区大小
                       int                                  stackaddr_set;    栈堆的地址集
                       void *                             stackaddr;          线程栈的位置
                       size_t                             stacksize;           线程栈的大小
                }pthread_attr_t;

 .detachstate,表示新线程是否与进程中其他线程脱离同步, 如果设置为PTHREAD_CREATE_DETACHED 则新线程不能用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,一个struct 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。目前LinuxThreads仅实现了PTHREAD_SCOPE_SYSTEM一值。
 


posted @ 2015-07-29 14:50  kaylee  阅读(283)  评论(0编辑  收藏  举报