线程间同步互斥

互斥: 同一时刻只能一个任务访问一个资源
同步: 在互斥的基础上,访问有一定的先后顺序

实现互斥的方法: 互斥锁 信号量
实现同步的方法: 信号量
信号量概述.
信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一 个非负的整数计数器,它被用来控制对公共资源的访问。
编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于0时,则可以访问,否则将阻塞。
PV原语是对信号量的操作,-次P操作使信号量减1, - -次V操作使信号量
加1。
信号量主要用于进程或线程间的同步和互斥这两种典型情况。
信号量数据类型为: sem_ t。
信号量:大于等于0的一个数

信号量用于同步
在这里插入图片描述
信号量用于互斥

在这里插入图片描述
互斥锁
互斥锁使用是一种简单的加锁机制

互斥锁的工作原理:
1 任意的线程,都先尝试上锁,如果锁处于上锁状态,这个时候线程会被阻塞,直到这个锁被解锁,才不会阻塞,再去上锁如果锁处于解锁状态,上锁成功
2 访问完资源,之后出来要记得解锁,不解锁,其他线程无法获得锁
3 解锁者必须是上锁者
互斥锁的数据结构:
pthread_mutex_t

互斥锁的初始化有2种方法:
静态初始化锁:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
注意:这样初始化只能用这个宏初始化一把锁,

动态初始化锁:
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
功能:
初始化一个互斥锁。
参数:
mutex:互斥锁地址。类型是 pthread_mutex_t 。
attr:设置互斥量的属性,通常可采用默认属性,即可将 attr 设为 NULL。
可以使用宏 PTHREAD_MUTEX_INITIALIZER 静态初始化互斥锁,比如:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
这种方法等价于使用 NULL 指定的 attr 参数调用 pthread_mutex_init() 来完成动态初始化,不同之处在于 PTHREAD_MUTEX_INITIALIZER 宏不进行错误检查。
返回值:
成功:0,成功申请的锁默认是打开的。
失败:非 0 错误码

销毁锁:
#include <pthread.h>
int pthread_mutex_destroy(pthread_mutex_t *mutex);
功能:
销毁指定的一个互斥锁。互斥锁在使用完毕后,必须要对互斥锁进行销毁,以释放资源。
参数:
mutex:互斥锁地址。
返回值:
成功:0
失败:非 0 错误码

上锁:
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
功能:
对互斥锁上锁,若互斥锁已经上锁,则调用者阻塞,直到互斥锁解锁后再上锁。
参数:
mutex:互斥锁地址。
返回值:
成功:0
失败:非 0 错误码

解锁:
#include <pthread.h>
int pthread_mutex_unlock(pthread_mutex_t *mutex);
功能:
对指定的互斥锁解锁。
参数:
mutex:互斥锁地址。
返回值:
成功:0
失败:非0错误码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值