Linux线程

一、线程概念

多个线程共享同一个进程的资源,每个线程参与操作系统的统一调度

可以简单理解: 进程 = 进程资源 + 主线程 + 子线程 + …

联系紧密的任务在并发时优先选择多线程,如果任务之间比较独立,在并发时建议选择多进程。

共享进程的资源 :
同一块地址空间
文件描述符表
每种信号的处理方式(如:SIG_DFL,SIG_IGN或者自定义的信号优先级)
当前工作目录
用户id和组id

独立的资源
线程栈
每个线程都有私有的上下文信息。
线程ID
寄存器的值
errno变量
信号屏蔽字以及调度优先级

Linux查看线程的命令:
1).ubuntu下安装 sysstat工具后,可以支持 pidstat
安装命令:sudo apt install sysstat
在这里插入图片描述
选项说明:
-t:显示指定进程所关联的线程
-p:指定进程pid

2).top指令
示例: top -H -p 3027

3)ps命令
ps 命令结合 -T 选项就可以查看某个进程下所有线程

二、线程创建

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
失败:返回错误码

:typedef unsigned long int pthread_t;
一旦子线程创建成功,则会被独立调度执行,并且与其他线程并发执行
在编译时需要链接 -lpthread[Compile and link with -pthread]

三、线程的等待、退出和分离

线程退出pthread_exit:
原型:void pthread_exit(void *retval);
参数:retval:线程返回值,通过指针传递
返回值:成功返回 0,失败返回 -1
注:
1.当主线程调用pthread_exit函数时,进程不会结束,也不会导致其他子线程退出
2. 任何线程调用exit函数会让进程结束

线程等待pthread_join阻塞调用线程并将等到的子线程释放资源:
原型int pthread_join(pthread_t thread, void **retval);
参数
thread:线程 ID
retval:获取线程退出值的指针
返回值:成功返回0,失败返回错误码

线程分离
线程分为可结合的可分离的

可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的

线程创建的默认状态为可结合的

可分离的线程不能被其他线程回收或者杀死的,该线程的资源在它终止时由操作系统来自动释放

线程分离调用 pthread_detach 函数:
原型:int pthread_detach(pthread_t thread);
参数:thread:线程ID
返回值:成功返回0,失败返回-1

注意:线程分离函数不会阻塞线程的执行

四、创建多个线程

1.不能递归操作
2.根据线程不同的任务,要调用不同的的线程执行函数

多线程任务相同创建示例:

在这里插入图片描述

五、线程间通信

线程作为操作系统调度最小单元,有独自的栈空间,但每个线程都孤立运行就会产生资源浪费,那么就需要线程之间通信来合作完成任务,提高资源利用率与效率

主线程向子线程传递参数
通过 pthread_create 函数的第4个参数 arg 进行传递

示例:
在这里插入图片描述

六、线程互斥锁

互斥目的:让多个线程通过设定的顺序来执行,以免多个子线程在使用资源时互相争夺,避免多个线程同时修改全局变量

线程互斥锁的工作机制:
当线程A获得锁,另外一个线程B在获得锁时则会阻塞,直到线程A释放锁,线程B才会获得锁。

原理:
本质上是一个pthread_mutex_t类型的变量,假设名为 v
当 v = 1,则表示当前临界资源可以竞争访问 ,得到互斥锁的线程则可以访问,此时 v = 0
当 v = 0,则表示临界资源正在被某个线程访问,其他线程则需要等待

特点:
如果两个线程访问的是同一个 pthread_mutex_t 变量,那么它们访问了同一个互斥锁
对应的变量定义在 pthreadtypes.h 头文件中,是一个共用体中包含一个结构体

线程互斥锁的初始化:

静态:
定义 pthread_mutex_t 类型的变量,然后对其初始化为:PTHREAD_MUTEX_INITIALIZER

即:pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER

动态:
两个函数 pthread_mutex_init 函数 与 pthread_mutex_destroy 函数
前者初始化创建,后者销毁互斥锁

初始化函数原型:int pthread_mutex_init(pthread_mutex_t *restrict mutex,const
pthread_mutexattr_t *restrict attr);
参数:
mutex:线程互斥锁对象指针
attr:线程互斥锁属性
返回值:成功返回0,失败返回错误编码

销毁函数原型:int pthread_mutex_destroy(pthread_mutex_t *mutex);
参数:mutex:销毁的互斥锁指针

操作互斥锁: 获取锁(lock) 与 释放锁(unlock)

获取锁的函数:pthread_mutex_lock
释放锁的函数:pthread_mutex_unlock

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值