模型场景
分析:
缓冲区buff中存放数据
生产者和消费者数目不固定,生产者向缓冲区写入数据,一次写入一个整形,消费者从缓冲区读数据,一次读一个并打印。
生产者写数据时生产者就不可以读取,反之亦然。因此需要互斥锁
多个生产者不可以同时写数据,多个消费者也不可以同时读数据。所以也需要互斥锁
生产者有空间才可以写,没有空间就不能写;消费者有数据才可以读,没有数据就不可以读。所有使用一个信号量不能完成
编程流程:
生产者同步流程
需要循环向buff写入数据:
1.P(sem_empty);判是否可以进行P操作,若可以代表缓冲区有空闲空间,此时空闲空间减一
必须先P操作后加锁:若没有剩余空间就不用加锁了
2.lock():给缓冲区加锁,加锁成功就向缓冲区写数据
3.buff[i] = n :向buff中写数据
4.unlock():写完数据,给缓冲区解锁
5.V(sem_full);生产者写完数据,有数据的空间就加一
消费者同步流程
需要循环从buff读数据:
1.P(sem_full);判是否可以进行P操作,若可以代表缓冲区有数据,此时数据数量减一
2.lock():给缓冲区加锁,加锁成功就从缓冲区读数据
3.printf(buff[i] ) :从buff中读数据并打印
4.unlock():读完数据,给缓冲区解锁
5.V(sem_empty);消费者读完数据,意味着缓冲区空的数目就增加一