多线程

线程概念,线程控制,线程安全,线程池
线程概念:线程是进程中的执行流,是CPU调度的基本单元;Linux下的线程是通过pcb来实现的,一个进程中可以有多个线程pcb,这些pcb共享进程的大部分资源(包括:IO信息,程序地址空间,文件描述信息,信号信息)Linux下的pcb相较于传统的pcb更加的轻量化,因此Linux下的线程也被称之为轻量级的进程
pcb: 进程控制块(是系统为进程设置的一个专门的数据结构,用它来记录进程的外部特征,描述进程的运动变化状态,系统利用pcb来管理和控制进程,所以pcb是操作系统感知进程唯一标志,进程和pcb是一一对应的)
在这里插入图片描述线程和进程之间的区别要从不同的角度来阐述:进程是系统进行资源分配的基本单位,而线程是cpu调度的基本单位
进程是程序运行中资源分配的基本单位,而线程是程序运行当中的一条执行流,具体的体现是通过pcb来调度管理程序的运行

线程之间共享和独有了哪些信息:
共享:虚拟地址空间,文件描述符表(打开的文件信息[网络中]), 信号处理方式(信号是针对整个进程产生效果的,当信号到来的时候,会在CPU上找到一个正在执行的流来处理这个信号)工作路径, 用户id,组id
独有:标识符,栈,上下文数据(一套寄存器),信号屏蔽字,erron
多任务的多执行流并发/并行处理:
并发:多任务的轮询处理 并行:多任务同时处理
多执行流的处理的优势: 充分利用CPU,降低IO阻塞时间
多进程:1.线程之间会相互影响,所以多进程的应用的健壮性会更强

多线程:1.线程间通信更加灵活(包括线程间通信方式,全局变量,函数传参)
2.线程的创建和销毁的成本以及线程所占有的资源会更低,
3.同一进程中线程的切换的成本会更低
开辟线程的数量要根据实际的压力测试来制定

  • 线程控制:创建,终止,等待,分离
    int pthread_create(pthread_t *tid,pthread_attr_t *attr,void* (thread_routine)(void *),void* arg);(线程id,结构体,线程入口函数,函数参数)
    线程终止:
    线程入口函数中return (线程入口函数运行完毕,则线程就会退出)
    在任意位置退出:[线程主动退出]void pthread_exit(void *retval); [线程被动退出]int pthread_cancel(pthread_t tid);
    线程等待:等待一个线程退出,获取线程的返回值,释放线程的资源
    线程有个分离属性,默认为joinable状态,处于joinable状态的线程退出后需要被等待,才能释放资源
    int pthread_join(pthread_t tid,void** retval);retval获取的线程退出的返回值
    线程分离:将线程的分离属性设置为detach状态,处于detach装填的线程退出之后自动释放资源,detach状态的线程不能被等待
    int pthread_detach(pthread_t tid);

  • 线程安全
    概念:线程对临界资源的访问是安全的
    临界资源:多个线程都能够访问到的资源 临界区:对临界资源访问的这段代码就是临界区
    实现:
    互斥:同一时间对临界区的唯一访问实现临界资源访问的安全性
    同步:让线程按照某种秩序对临界资源访问,实现访问的合理性
    互斥:互斥锁,本质是一个0-1计数器,标记临界资源的访问状态
    流程: 1.定义/创建互斥锁 2.初始化互斥锁 3.访问前加锁 4访问后解锁 5.销毁互斥锁
    加锁:先判断资源状态是否可以访问,可访问,则正确返回,在返回之前,将资源置为不可访问状态;不可访问则阻塞线程或报错返回
    解锁:将资源置为可访问状态

接口:
pthread_mutex_t mutex;
int pthread_mutex_init(pthread_mutex_t *mutex,pthread_mutexattr_t *attr);
int pthread_mutex_lock(pthread_mutex_t *mutex)[阻塞加锁]/pthread_mutex_trylock(pthread_mutex_t *mutex)[非阻塞加锁]
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destory(pthread_mutex_t *mutex);

信号量: 用于实现同步与互斥
本质:就是一个计数器以及提供一个 pcb等待队列向外提供P/V操作,实现同步与互斥
P操作:在临界资源访问之前进行P操作,计数-1,对计数进行判断,小于0则不符合访问条件使线程阻塞或者报错返回,或正确返回获取资源
V操作:在产生一个资源后,进行V操作,计数+1,唤醒一个等待的线程或者进程
互斥的实现:
计数为1,表示资源只有1个,在访问资源之前P操作,计数-1,其他线程无法访问,相当于加锁;访问完毕之后进行V操作–解锁;
流程: 1.创建信号量 2.初始化信号量 3.获取资源之前进行P操作计数-1; 4.生产资源之后进行V操作计数+1; 5.销毁信号量
信号量:标识sem_t
接口介绍:
初始化:int sem_init(sem_t *sem, int pshared, int value);//pshared为0表示用于线程间,pshared非0表示用进程间
资源-1:int sem_wait(sem_t *sem)/sem_trywait/sem_timedwait
资源+1:int sem_post(sem_t *sem);
销毁:int sem_destroy(sem_t *sem);

线程池:
实现:1.一个线程安全的任务队列 2.大量的工作线程
工作线程不断从任务队列中获取任务进行处理
不同的任务有不同的处理方式,如何让工作线程灵活的处理各种任务?
–交个线程池任务的同时也将任务的处理方式交给线程池,线程池中的线程用给定的任务处理方式处理给定的任务即可
–线程池不仅要实现线程池,还有实现任务的处理方式(就是不仅有数据还有有方法)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值