信号量(二)——生产者消费者
作者:
贺谦
,
2021-01-18 02:38:29
,
所有人可见
,
阅读 452
- 信号量
ety_buf
——表示【空缓冲区】的个数
- 信号量
ful_buf
——表示【满缓冲区】的个数
- 互斥锁
mtx_buf
——用来保护【缓冲区】
#include <iostream>
#include <queue>
using namespace std;
struct semaphore
{
int cnt;
queue<int> q;
};
void P(semaphore* sem)
{
sem->cnt--;
if (sem->cnt < 0)
{
// 实施P操作的进程状态会变成“阻塞态”
// 该进程会进入相应信号量的“队列末尾”
/* 重新调度其他进程 */
}
}
void V(semaphore* sem)
{
sem->cnt++;
if (sem->cnt <= 0)
{
// cnt <= 0 说明原来的“等待队列”中有“进程”在等待资源
// 那么就“唤醒”等待队列中的一个“进程”
// 将这个进程的状态转化为“就绪态”,并将其插入“就绪队列”
}
}
semaphore ety_sem;
semaphore ful_sem;
semaphore mtx_sem;
int produce_item()
{
}
void producer(void)
{
int item;
while (true)
{
item = produce_item();
P(&ety_sem);
P(&mtx_sem);
item++;
V(&mtx_sem);
V(&ful_sem);
}
}
void consume_item(int item)
{
}
void consumer(void)
{
int item;
while (true)
{
P(&ful_sem);
P(&mtx_sem);
item--;
V(&mtx_sem);
V(&ety_sem);
consume_item(item);
}
}
// 1. P操作的顺序是否可以颠倒?—— 会导致“死锁”
// 2. V操作的顺序是否可以颠倒?—— 不会导致“死锁”,但是会导致“锁的粒度”加大
// 从而其他进程就不能及时地拿到“锁”