一 信号量忙等待方式的实现
#include<iostream>
using namespace std;
typedef struct{
int value; //信号量的值
int lock; //锁
}Semophore_t;
//P操作
void P(Semophore_t *ps){
for(;;)
{
//对ps的互斥操作
while(TSL(&ps->lock)); //原子操作
if(ps->value>0){
ps->value--;
break;
}
ps->lock=0; //如果无资源可用 就放开临界区,允许其它进程进入
}
ps->lock=0;
//这是通过break语句后执行的代码。表明进程已经获取到了希望获取的资源需要放开临界区。
}
//V操作
void V(Semaphore_t *ps){
while(TSL(&ps->lock));
ps->value++;
ps->lock=0;
}
int main()
{
//定义自己需要的操作即可。
}
二 阻塞方式实现的信号量
就是要把等待的进程放入等待队列,而不是一直检测,联系忙等待定义理解即可,这里仅列出PV操作。
/P操作
void P(Semophore_t *ps){
for(;;)
{
//对ps的互斥操作
while(TSL(&ps->lock)); //原子操作
if(ps->value>0){
ps->value--;
break;
}
else{
将该进程放入等待队列ps->list
阻塞该进程,并设置ps->lock=0;
}
}
}
//V操作
void V(Semaphore_t *ps){
while(TSL(&ps->lock));
if(ps->list==NULL){
ps->value++;
}else{
从list里面挪出来一个进程
将进程P放入就绪队列中
}
ps->lock=0;
}