- 信号量中的PV操作,解决互斥问题
#include <queue>
using namespace std;
struct semaphore
{
int cnt;
queue<int> q;
};
// P操作,减1
// 对应:sem_wait()
void P(semaphore sem)
{
sem.cnt--;
if (sem.cnt < 0)
{
// 实施P操作的进程状态会变成“阻塞态”
// 该进程会进入相应信号量的“队列末尾”
/* 重新调度其他进程 */
}
}
// V操作,加1
// 对应:sem_signal()
void V(semaphore sem)
{
sem.cnt++;
if (sem.cnt <= 0)
{
// cnt <= 0 说明原来的“等待队列”中有“进程”在等待资源
// 那么就“唤醒”等待队列中的一个“进程”
// 将这个进程的状态转化为“就绪态”,并将其插入“就绪队列”
}
}
// 1. P, V操作均是“原子操作”
// 2. 进程之间的“互斥问题”