C编程中对理解线程

一、线程的概述

二、线程的属性

========================================================================================

线程概述:

      一个进程内部由若干个进程组成,进程的出现使得多个程序可以并发执行,节省了资源利用率;而线程的引入则帮助减少了程序并发执行时带来的时空开销。

     线程,又称轻量进程,代表一个进程中某个单一顺序的控制流。线程是进程中的一个实体,是被系统独立调度和分配的基本单位。

     一个进程中的若干个线程是共享进程中所拥有的全部资源的,每个线程本身是不拥有系统资源的,只是拥有少量的必备资源,如程序计数、寄存器、栈等。

     在Linux多处理器系统中,不同线程可以同时运行在不同的CPU上,一个线程可以创建和终止另一个线程,一个进程中的多个线程可以并发执行。

 

线程属性:

每一个物品都有其自身的属性,用于区别与其他物品不同的标识。人与人之间的不同,也是源于每个人都有自己独特的属性。在Linux系统中,每一个线程都拥有一个自身的属性,用于代表该线程的特性,而一个进程中的多个线程,也有其共同的属性。接下来,通过理解Linux系统中提供的调用函数,对线程的属性进行操作,进而掌握线程的这些属性。
1.摧毁与初始化线程属性对象
当使用一个线程的属性对象前,需要首先初始化该对象,然后才可以对该线程的属性进行设置和修改。初始化线程属性的函数原型为:

#include<pthread.h>
int pthread_attr_init(pthread_attr_t *attr);

若该函数调用成功,返回值为0,调用失败,返回值为非0值。
pthread_attr_init()函数必须在创建线程函数之前调用,可以使用函数中参数attr中的属性来初始化线程属性的对象。
pthread_attr_destroy()函数的功能是摧毁attr所指向的线程属性对象。销毁的attr属性对象可以使用上述初始化函数重新初始化,该摧毁属性对象的函数的原型为:

#include<pthread.h>
int pthread_attr_destroy(pthread_attr_t *attr);

参数attr是pthread_attr_t结构体类型的。该结构体类型中,定义了attr参数的属性,定义如下:
typedef struct
{
int__detachstate;                                    /*线程的分离状态*/
int__schedpolicy;                                    /*线程调度策略*/
struct sched_param__schedparam;        /*线程的调度参数*/
int__inheritsched;                                    /*线程的继承性*/
int__scope;                                              /*线程的作用域*/
size_t__guardsize;
int__stackaddr_set;
void *__stackaddr;                                  /*线程堆栈位置*/
unsigned long int__stacksize;                /*线程堆栈大小*/
}pthread_attr_t;

在pthread_attr_t结构体类型中定义了上述线程属性,这些属性的意义如下:
þ    detachstate
若表示线程的可连接状态,可以取值为PTHREAD_CREATE_JOINABLE;若表示线程的分离状态,可以取值为PTHREAD_CREATE_DETACHED。
þ    schedpolicy
该变量表示线程的调度策略,当取值为SCHED_OTHER时,属性表示普通,非实时的调度策略;若取值为SCHED_RR,属性表示实时、轮转的调度策略;当变量取值为SCHED_FIFO时,属性表示实时、先进先出的调度策略。
þ    schedparam
该变量代表线程的调度参数,该值由线程的调度策略决定。
þ    inheritsched
表示线程的继承性。当取值为PTHREAD_EXPLICIT_SCHED时,表明是否从父线程处继承调度属性;当取值为PTHEAD_INHERIT_SCHED时,表明从父进程继承。
þ    scope
该变量表示线程的作用域,当取值为PTHREAD_SCOPE_SYSTEM时,表明每个线程占用一个系统时间片。
2.设置与获取线程的分离状态
关于线程的分离状态这个属性,其决定了线程是如何结束的。在默认情况下,线程是属于可连接状态的,这样线程在进程没有退出之前,是不会释放线程所占用的资源的,此状态下,可以通过调用pthread_join函数来等待其他线程的结束,这样线程在结束之后,不会等待进程退出,会自动释放掉自己的资源,而处于分离状态的线程在终止后会释放掉自身所占资源。
pthread_attr_setdetachstate()函数和pthread_attr_getdetachstate()函数是用来设置和获取线程的分离状态这个属性的,这两个函数的原型为:

#include<pthread.h>
Int pthread_attr_setdetachstate(pthread_attr_t* attr,int detachstae);
Int pthread_attr_getdetachstate(pthread_attr_t*attr,int detachstate);

参数说明:
attr:作为设置线程属性的参数,attr指向要设置的线程属性对象的指针;作为获取线程属性的参数,attr作为从该参数中获取线程的分离状态的信息。
detachstate:该参数取值为PTHREAD_CREATE_DETACHED和PTHREAD_CREATE_JOINABLE。在设置属性的函数中,将属性设置为这两种属性,若在获取属性的函数中,detachstate参数所指向的内存中存放获取到的属性。
3.设置与获取线程属性对象的调度策略
在前面的介绍中,已经了解到了调度策略信息有SCHED_OTHER、SCHED_RR和SCHED_FIFO等3种形式。要对线程的这3中调度策略属性进行设置和修改,需要用到如下函数:
#include<pthread.h>
Int pthread_attr_setschedpolicy(pthread_attr_t* attr,int policy);
Int pthread_attr_getschedpolicy (pthread_attr_t*attr,int policy);

在pthread_attr_setschedpolicy()设置属性函数中,参数attr指向要设置的线程属性对象的指针。参数policy为要设置的属性内容,即要设置的调度策略形式。
在pthread_attr_getschedpolicy()获取属性函数中,从attr参数中获取线程调度策略信息,将结果赋给policy指针所指向的内存空间中。
&    说明:关于线程相关属性的设置和获取,都有相应的函数进行操作,这里不做详细介绍。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值