1.简介
互斥与等待用于线程之间的同步,这将允许多线程或多进程之间共享数据。
生产者消费者模型是一个典型的例子,考虑两种情况:
1.生产者的生产的速度快于消费者。
2.消费者的消费的速度快于生产者。
这样通信双方有一方必然阻塞,比如说,上述生产者生产速度快于消费者消费速度的情况,如果使用管道来处理这个问题,当管道被塞满后,内核就在生产者调用write
时把它投入睡眠,直到管道中有空余的空间。这就是同步,不过内核帮咱们把这些事情做了,这种类型的同步是隐式的(implicit),类似的使用消息队列的IPC形式,内核依旧会处理同步。
然而,当我们使用共享内存这种IPC形式的时候,就必须执行某种类型的显示(explicit)同步。
互斥锁和条件变量能够帮我们实现显示的同步:
1.互斥锁保护持有锁的线程进入临界区后安全的修改线程共享的内容。
2.条件变量可用于等待条件的发生。
使用的互斥锁和条件变量的时候就是注意不要死锁和虚假唤醒即可。
2.示例
结合条件变量和互斥锁的应用,可以参考封装条件变量,介绍了《Linux多线程服务端编程》中一个简单的BlockingQueue(消费>生产的情况)。
因为生产者消费者同时启动线程,这里用到了互斥和等待两种同步。
代码见~/unpv22e/mutex/prodcons6.c
/* include globals */
#include "unpipc.h"
#define MAXNITEMS