生产者消费者模型
POSIX标准信号量
作用:实现进程 / 线程间的同步与互斥;
本质:一个计数器+ pcb等待队列
- 实现同步:计数器对资源数量进行计数,当线程想要获取资源的时候,先访问信号量,判断是否能够获取(信号量通过自身的计数完成判断)若计数< =0则直接阻塞线程,计数-1;其它线程生产资源之后,计数+1,唤醒等待队列上的pcb
- 实现互斥:保证计数器的数值不会大于1,就表示同一时间只有一个线程能够访问资源;
操作接口:
1.定义信号量:
sem_t sem;
2.初始化信号量:
int sem_init(sem_t *sem, int pshared, int value);
pshared:信号量即可用于进程间也可用于线程间,
pshared为0表示用于线程间 非0表示用于进程间
value:信号量就是一个计数器, 统计资源数量,value就是通过资源数量初始化计数器的
3.在访问临界资源之前,先判断计数,是否能够访问资源,若不能访问,则阻塞线程;若可以访问则调用直接返回
int sem_wait(sem_t *sem); / int sem_trywait(sem_t *sem);/
int sem_timedwait(sem_t *sem, struct timespec *ts);
4.访问临界资源之后/生产资源之后,唤醒一个等待的线程,并且计数+1
int sem_post(sem_t *sem);
5.不使用信号量记得释放资源
int sem_destroy(sem_t *sem);
信号量的应用:
通过信号量实现一个环形队列,最终实现一个生产者与消费者模型
/*===============================================================
* 描 述:这个demo中封装一个RingQueue类,实现生产者与消费者模型
================================================================*/
#include <cstdio>
#include <iostream>
#include <queue>
#include <pthread.h>
#include <semaphore.h>
#define MAX_QUEUE 5
#define MAX_THREAD 5</