互斥锁(使用过程及应用场景)

本文详细介绍了互斥锁的使用流程,包括定义、初始化、加锁、解锁和销毁,并通过抢票程序为例,阐述了在多线程环境中如何正确使用互斥锁以避免死锁问题。同时,讨论了未解锁可能造成的后果以及死锁的原因和解决方案。
摘要由CSDN通过智能技术生成

互斥锁使用流程

定义互斥锁变量

pthread_mutex_t:互斥锁变量的类型
    例:pthread_mutex_t mutex

初始化互斥锁变量

int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* attr);
    muter:互斥锁变量,传参数的时候,传入互斥锁变量的地址
    attr:互斥锁属性,一般情况下,我们都不需要关心,直接设置为 NULL
pthread_mutex_t mutex = PTHREAD_MUTEX_INTIALIZER;
    PTHREAD_MUTEX_INTIALIZER:宏定义,里面对结构体进行可宏定义,使用这种方式进行初始化的时候,其实是将结构体当中变量的值复制给互斥锁变量

加锁

int pthread_mutex_lock(pthread_mutex_t* mutex);
    mutex:互斥锁变量,传参数的时候,传入互斥锁变量的地址
    使用该接口进行加锁的时候
        如果临界资源可用,意味着互斥锁变量当中计数器的值为 1,可以进行加锁,对计数器的值进行减 1操作,加锁成功,执行流继续向下执行
        如果临界资源不可用,阻塞等待,执行流不会继续向下执行
int pthread_mutex_trylock(pthread_mutex_t* mutex);
    mutex:互斥锁变量,使用的时候,传入互斥锁变量的地址
        如果临界资源可用,意味着互斥锁变量当中计数器的值为 1,可以进行加锁,对计数器的值进行减 1操作,加锁成功,执行流继续向下执行
        如果临界资源不可用,不会进行阻塞等待,pthread_mutex_trylock 加锁失败,返回 BUSY(拿不到锁资源)
 int pthread_mutex_timedlock(pthread_mutex_t* mutex, const struct timespec* abs_timeout);
     mutex:互斥锁变量
     abs_timeout:加锁的超时时间
         当超过加锁的超时时间之后,还没有获取到互斥锁,就报错返回,不会再进行阻塞等待,返回 ETIMEOUT
     struct timespec 当中有两个参数,第一个参数是秒,第二个参数为纳秒

解锁

int pthread_mutex_nulock(pthread_mutex_t* mutex);
     mutex:互斥锁变量,使用的时候,传入互斥锁变量的地址
     三种加锁方式都可以用这种方式解锁

销毁

 int pthread_mutex_destroy(pthread_mutex_t* mutex);
       mutex:互斥锁变量,使用的时候,传入互斥锁变量的地址
       如果不调用销毁接口,会造成内存泄漏

互斥锁加锁解锁示意

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值