信号量的实现-----来自《天勤操作系统高分笔记》

设计思想来自该书,我自己又在书上的思想进行了加工,使用了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);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值