多任务并行——线程

1. 什么是线程

轻量化的进程,每一个线程都属于进程
进程是操作系统资源分配的最小单元                                                                                      
线程是CPU任务调度的最小单元
由于线程是一个轻量级的进程,所在进程为其分配独立的栈区空间
线程是一个任务执行的过程,包括创建、调度、消亡
线程的创建:线程空间创建于进程空间内部,从属于某个进程                                                                                 进程中的每个线程,栈区是独立的,共享进程中的数据区和文本区,堆区,内核存储线                        程控制模块

线程的调度:宏观并行,微观串行(与进程调度保持一致)

线程的消亡:线程运行结束后,回收线程的资源空间

2. 进程、线程的区别

        1)执行效率

        多线程执行效率高,(并发程度(创建速度快)和任务切换(在一个进程空间内部完成多线程任务切换)
        多进程执行效率低 

        2)通信角度

        线程可以共享空间,可以直接通信(多线程间可以使用全局变量通信,因为全局变量为共享空间)
        进程空间独立,不能直接通信(通信必须使用:管道、信号、消息队列、共享内存、信号灯等方式)

        3)安全性

        多进程安全(一个进程异常结束不影响其余进程执行)                                                                         多线程不安全(一个线程异常结束会导致进程结束,其余线程均无法继续执行)

        4)资源消耗

        进程的资源消耗要大于线程

3. 线程相关函数接口

(posix:可移植操作系统接口 Portable Operating System Interface of UNIX)

系统调用    pthread线程库
fork    pthread_create
exit    pthread_exit
wait    pthread_join
getpid, getppid    pthread_self

3.1 pthread_create
        int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                        void *(*start_routine) (void *), void *arg);

功能:
        创建一个线程
        参数:
                thread:存放线程ID空间首地址
                attr:线程的属性(默认NULL)
                start_routine:线程入口函数地址
                arg:给线程函数的参数
        返回值:
                成功:返回0
                失败:返回非0值

关于线程的创建     
每次pthread_create执行只能创建一个线程。
每个进程至少有一个线程称为主线程。
主进程退出则所有创建的子线程都退出。 
主线程必须有子线程同时运行才算多线程程序。
线程id是线程的唯一标识,是CPU维护的一组数字。
pstree 查看系统中多线程的对应关系。
多个子线程可以执行同一回调函数。

3.2 pthread_self
pthread_t pthread_self(void); unsigned long int; %lu
        功能:获取当前线程的线程id
        参数:无
        返回值:成功:返回当前线程的线程id
                      失败:-1;

3.3 pthread_exit(自杀)
void pthread_exit(void *retval);
        功能:子线程自行退出
        参数: retval 线程退出时候的返回状态,临死遗言。(不能是局部变量的地址)
        返回值:无

3.4 pthread_cancel(他杀:被另一个线程结束)
int pthread_cancel(pthread_t thread);
        功能:请求结束一个线程
        参数:thread 请求结束一个线程tid
        返回值:  成功 :0
                        失败 :-1;

3.5 pthread_join
int pthread_join(pthread_t thread, void **retval);    
        功能:通过该函数可以将指定的线程资源回收,该函数具有阻塞等待功能,如果指定的线程没有结束,则回收线程会阻塞等待。
        参数:thread  要回收的子线程tid
        retval  要回收的子线程返回值/状态。==》ptread_exit(值);
        返回值:  成功: 0
                        失败:-1;

关于线程的回收
        线程的结束机制:
        1)不同于进程,没有孤儿线程和僵尸线程的说法
        2)主进程结束任意生成的次线程都会结束。(因为共享的进程空间被回收了)。
        3)次线程的正常结束不会影响主线程的运行。

        子线程的回收策略:
        1)如果预估子线程可以有限范围内结束则正常用pthread_join等待回收。
        2)如果预估子线程可能休眠或者阻塞则等待一定时间后强制回收。
        3)如果子线程已知必须长时间运行则,不再回收其资源。

4. 线程属性

        1. 可结合性:能被其他线程回收和杀死的线程具有可结合性,在没有被其他线程回收之前,其资源不释放;//类似于僵尸进程
        使用pthread_join()函数回收。线程默认具有可结合性  joinable

        2. 分离属性:不能被其他线程回收和杀死的线程具有分离属性,其存储资源在终止时被系统自动释放。//类似于孤儿进程                                                                                                                      1)线程结束后空间自动被操作系统回收,无需调用回收线程的接口函数
        2)线程无法在线程结束实现同步
        3)无法回收线程结束状态

        设置分离属性,目的线程消亡,自动回收空间。

4.1 线程设置分离属性(方法一)
1)pthread_attr_init

        int pthread_attr_init(pthread_attr_t *attr);
        功能,初始化一个attr的变量
        参数:attr,需要变量来接受初始值
        返回:0  成功,
                   非0 错误;

2)pthread_attr_setdetachstate

        int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
        功能:把一个线程设置成相应的属性
        参数,attr,属性变量,有init函数初始化他。
        detachstate:有2个可选值,
        PTHREAD_CREATE_JOINABLE:可结合性--->0
        PTHREAD_CREATE_DETACHED:设置分离属性--->1

3)pthread_attr_destroy
        int pthread_attr_destroy(pthread_attr_t *attr);
        功能:
        销毁线程属性

4.2 线程设置分离属性(方法二)
1)pthread_detach                                                                                                                                  int pthread_detach(pthread_t thread);
        功能,设置分离属性
        参数,线程id号,填设置分离属性的id

2)线程退出清理函数:成对使用
        void pthread_cleanup_push(void (*routine)(void *), void *arg);                                                      功能:注册一个线程清理函数
        参数,routine,线程清理函数的入口
        arg,清理函数的参数。
        返回值,无

3)pthread_cleanup_pop

void pthread_cleanup_pop(int execute);
        功能:调用清理函数
        execute:非0,执行清理函数
                         0 ,不执行清理
        返回值,无

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值