多线程之互斥锁与条件变量

本文详细介绍了互斥锁(pthread_mutex)和条件变量(pthread_cond)在多线程编程中的使用,包括初始化、上锁、解锁、销毁等操作,以及条件变量的阻塞、解除阻塞、超时等待和广播唤醒等功能。这些工具对于实现线程间的同步和协作至关重要,确保了临界区的安全访问和复杂并发场景的正确控制。
摘要由CSDN通过智能技术生成

互斥锁操作函数

初始化锁

函数原型:

int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrist attr);

函数参数:
① mutex:互斥锁
② attr:互斥锁的属性(NULL为默认属性)。默认属性为快速互斥锁
快速互斥锁:如果临界区已经被一个线程获取,其他线程或者该线程再次获取时,调用线程直接被挂起。
递归互斥锁:已经获取临界区的线程可以多次获取,互斥量对象内部应有获取次数计数。如果要完全释放临界区,一定要保证获取次数和释放次数一致。

函数返回值:
成功返回:0
失败返回:出错码

获得互斥锁(上锁)

函数原型:

int pthread_mutex_lock(pthread_mutex_t *mutex);

函数参数:
① mutex:互斥锁。

函数返回值:
成功返回:0
失败返回:出错码

释放互斥锁(解锁)

函数原型:

int pthread_mutex_unlock(pthread_mutex_t *mutex);

函数参数:
① mutex:互斥锁。

函数返回值:
成功返回:0
失败返回:出错码

销毁互斥锁

函数原型:

int pthread_mutex_destroy(pthread_mutex_t *mutex);

函数参数:
① mutex:互斥锁。

函数返回值:
成功返回:0
失败返回:出错码

条件变量操作函数

初始化条件变量

函数原型:

int pthread_cond_init(pthread_cond_t *cv, const pthread_condattr_t *cattr);

函数参数:
① cv:条件变量
② cattr:条件变量的属性(NULL为默认属性),可以设置为进程内可用(默认)或是进程间可用。

函数返回值:
成功返回:0
失败返回:出错码

阻塞在条件变量上

函数原型:

int pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mutex);

函数参数:
① cv:条件变量
② mutex:要解开的互斥锁

函数说明:调用这个函数时,线程解开mutex指向的锁并被条件变量cv阻塞。
线程可以被函数pthread_cond_signal和函数 pthread_cond_broadcast唤醒,也可能在被信号中断后被唤醒。
线程被唤醒后,它将重新检查判断条件是否满足,如果还不满足,一般说来线程应该仍阻塞在这里,等待被下一次唤醒。这个过程一般用while语句实现。

函数返回值:
成功返回:0
失败返回:出错码

解除在条件变量上的阻塞

函数原型:

int pthread_cond_signal(pthread_cond_t *cv);

函数参数:
① cv:条件变量

函数说明:函数被用来释放被阻塞在指定条件变量上的一个线程。
必须在互斥锁的保护下使用相应的条件变量。否则对条件变量的解锁有可能发生在锁定条件变量之前,从而造成死锁。
如果没有线程被阻塞在条件变量上,那么调用pthread_cond_signal()将没有作用。

函数返回值:
成功返回:0
失败返回:出错码

阻塞直到指定时间

函数原型:

int pthread_cond_timedwait(pthread_cond_t *cv,pthread_mutex_t *mp, const structtimespec * abstime);

函数参数:
① cv:条件变量
② mutex:要解开的互斥锁
③ abstime:时间参数

函数说明:函数到了一定的时间,即使条件未发生也会解除阻塞。这个时间由参数abstime指定。函数返回时,相应的互斥锁往往是锁定的,即使是函数出错返回。

注意:pthread_cond_timedwait函数也是退出点。

函数返回值:
成功返回:0
失败返回:出错码
超时返回的错误码是ETIMEDOUT

释放阻塞的所有线程

函数原型:

int pthread_cond_broadcast(pthread_cond_t *cv);

函数参数:
① cv:条件变量

函数说明:函数唤醒所有被pthread_cond_wait函数阻塞在某个条件变量上的线程,参数cv被用来指定这个条件变量。当没有线程阻塞在这个条件变量上时,pthread_cond_broadcast函数无效。

注意:由于pthread_cond_broadcast函数唤醒所有阻塞在某个条件变量上的线程,这些线程被唤醒后将再次竞争相应的互斥锁,所以必须小心使用pthread_cond_broadcast函数。

函数返回值:
成功返回:0
失败返回:出错码

释放条件变量

函数原型:

int pthread_cond_destroy(pthread_cond_t *cv);

函数参数:
① cv:条件变量

注意:条件变量占用的空间并未被释放。

函数返回值:
成功返回:0
失败返回:出错码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈海平20220310

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值