设计思想来自该书,我自己又在书上的思想进行了加工,使用了STL将其描述出来
#include<bits/stdc++.h>
using namespace std;
//信号量的定义
template<class T>
class Semaphore
{
private:
int count;
queue <T> que;
public:
Semaphore( )
{
}
Semaphore(int n)
{
this->count = n;
}
void Waite( T& process) // P 操作,一定会在对应的V操作之前执行
{
-- (this->count);
if ((this->count) < 0)
{
//阻塞该进程
//T.stop();
//将该进程插入到等待队列S.que
que.push(process);
}
return;
}
void Signal( T& process) // V操作
{
++(this->count);
if ((this->count ) <= 0)
{
//从等待队列取出第一个进程P;
process = que.front(); que.pop();
//将P插入就绪队列
//T.Prepare();
}
}
};
template <class T>
struct PCB { //进程控制块,用来代表一个进程
T data;
};
Semaphore< PCB<int> > N = Semaphore< PCB<int> >(); // 创建该类型的零值
PCB<int> p;
//信号量的应用------实现进程同步 P1中有一条语句S1,P2中有一条语句,S1必须在S2之前进行执行
void P1()
{
//……
//S1;
N.Signal(p); // V 操作
//……
}
void P2()
{
//……
N.Waite(p); // P 操作
//S2;
//……
}
//信号量的应用 --实现进程P3和P4之间的互斥
Semaphore<PCB<int> > N1 = Semaphore<PCB<int> >(1);
void P3()
{
N1.Waite(p);
//P3的临界区代码
N1.Waite(p);
}
void P4()
{
N1.Waite(p);
//P4的临界区代码
N1.Waite(p);
}