Linux 下多线程的概念及其具体操作

多线程

目的
多了实现多任务处理方式。

多任务处理
多创建几个进程,能够串行化的完成多个任务;以前我们说一个进程就是一个 pcb ,是操作系统对一个运行中程序的描述。
而现在我们说的线程其实是进程中的一条执行流,该执行流在 Linux 下通过 pcb 实现,因此实际上线程就是一个 pcb, 然而 pcb 却代表一个进程,并且 Linux 下的 pcb 共用一个虚拟地址空间,相较于传统 pcb 更加轻量化, 所以又称为轻量化进程。(可以说一个线程的集合 -> 线程组 就是一个进程)

进程、多进程、多线程的具体描述图
在这里插入图片描述
线程之间的独有和共享

独有:

  1. 进程标识符
  2. 寄存器
  3. 信号屏蔽字
  4. errno (保存系统调用完成后的错误编号的全局变量,因为具有覆盖性,所以独有)
  5. 调度优先级

共享:

  1. 虚拟地址空间
  2. 文件描述符
  3. 信号处理方式
  4. 用户ID/组ID/工作路径

多线程 和 多进程之间的优缺点

多线程的优点

  1. 通信灵活
  2. 创建和销毁的成本低
  3. 同一个进程中的各线程的调度成本低、切换更容易
  4. 线程的执行力度更加详细

多进程的优点

  1. 稳定性更高
  2. 健壮性更高

二者缺点就是对方的优点。

线程控制的操作命令

1. 线程的创建
#include <pthread.h>  // 头文件
返回值: 成功 0  失败 大于0的数
线程的调度顺序取决于操作系统
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);
参数:
    1> thread: 输出型参数,用于获取线程的tid(线程独有的空间的首地址)
    2> attr: 线程属性,用于在创建时设置属性,通常置NULL
    3> start_routine: 函数指针,是线程入口函数,运行完后自动退出
    4> arg: 通过线程入口函数,传递给线程参数,不用可置NULL
    
2.线程的等待
等待一个线程的退出并获取退出线程的返回值,回收退出线程的资源
返回值:  成功 0  失败 错误编号
int pthread_join(pthread_t thread, void **retval);

参数:
    1> thread: 要等退出的线程的tid
    2> retval: 一个二级指针,用于返回退出线程的返回值

3. 线程分离
分离一个线程,一定是对它的返回值不感兴趣,不想获取,或者不想等待线程退出
线程退出后自动释放所占资源,无需也不能够被等待(线程等待 和 线程分离 是互斥关系,即二者只能存在一个)
返回值:  成功 0  失败 错误编号

int pthread_detach(pthread_t thread)

参数:
    1> thread: 所要分离线程的tid

4. 线程的退出
一个线程的集合(线程组) 就是一个进程,所以一旦进程退出,所有的线程都会退出

<1> return 退出
    return 在线程中使用退出的是该线程,但若是在 main 函数(主线程)中使用,退出的就是进程而非主线程了
    
<2>  void pthread_exit(void *retval);
     retval: 要退出的线程的接口,谁调用就退出哪个线程
     在主线程中调用退出的是主线程而非进程
     
<3>  int pthread_cancel(pthread_t thread);
     thread: 要取消线程的tid
     
1>线程取消的定义

一般情况下,线程在其主体函数退出的时候会自动终止,但同时也可以因为接收到另一个线程发来的终止(取消)请求而强制终止。

2> 线程取消的语义

1 线程取消的方法是向目标线程发Cancel信号,但如何处理Cancel信号则由目标线程自己决定,或者忽略(当禁止取消时)、或者立即终止(当在取消点 或异步模式下)、或者继续运行至Cancelation-point(取消点,下面将描述),总之由不同的Cancelation状态决定。

2 线程接收到CANCEL信号的缺省处理(即pthread_create()创建线程的缺省状态)是继续运行至取消点再处理(退出),或在异步方式下直接 退出。一个线程处理cancel请求的退出操作相当于pthread_exit(PTHREAD_CANCELED)。当然线程可以通过设置为 PTHREAD_CANCEL_DISABLE来拒绝处理cancel请求,稍后会提及。

<4> exit 
    void eixt(int status) 
    status: 通常置 0
    不管在任意一个线程中调用,退出的都是进程而非线程

具体操作
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值