进程间通信笔记(5)—互斥锁和条件变量

本文介绍了互斥锁和条件变量在多线程同步中的应用,特别是在生产者消费者模型中的作用。互斥锁确保线程安全地修改共享数据,条件变量则用于等待特定条件的发生。通过示例展示了如何在实践中使用这两者,以解决生产者速度大于消费者速度时的同步问题。文中还提及了一种避免上锁冲突的优化策略。
摘要由CSDN通过智能技术生成

1.简介

互斥与等待用于线程之间的同步,这将允许多线程或多进程之间共享数据。

生产者消费者模型是一个典型的例子,考虑两种情况:

1.生产者的生产的速度快于消费者。
2.消费者的消费的速度快于生产者。

这样通信双方有一方必然阻塞,比如说,上述生产者生产速度快于消费者消费速度的情况,如果使用管道来处理这个问题,当管道被塞满后,内核就在生产者调用write时把它投入睡眠,直到管道中有空余的空间。这就是同步,不过内核帮咱们把这些事情做了,这种类型的同步是隐式的(implicit),类似的使用消息队列的IPC形式,内核依旧会处理同步。

然而,当我们使用共享内存这种IPC形式的时候,就必须执行某种类型的显示(explicit)同步。

互斥锁和条件变量能够帮我们实现显示的同步:

1.互斥锁保护持有锁的线程进入临界区后安全的修改线程共享的内容。
2.条件变量可用于等待条件的发生。

使用的互斥锁和条件变量的时候就是注意不要死锁和虚假唤醒即可。


2.示例

结合条件变量和互斥锁的应用,可以参考封装条件变量,介绍了《Linux多线程服务端编程》中一个简单的BlockingQueue(消费>生产的情况)。

因为生产者消费者同时启动线程,这里用到了互斥和等待两种同步。
代码见~/unpv22e/mutex/prodcons6.c

/* include globals */
#include    "unpipc.h"

#define MAXNITEMS       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值