1、实现进程互斥
注意:
- 互斥信号量mutex初值为1;
- 每个进程中将临界区代码置于P(mutex)和V(mutex)原语之间;
- 必须成对使用P和V原语(在同一进程中),不能次序错误、重复或遗漏: 遗漏P原语则不能保证互斥访问 遗漏V原语则不能在使用临界资源之后将其释放(给其他等待的进程);
seamphore m=1;
void main()
{cobegin p1; cobegin p2; }
p1{ wait(m); user r; signal(m); }
p2{ wat(m); user r; signal(m); }
2、实现进程有序
注意:
- 信号量值为0的点是限制的关键所在;
- 成对使用P和V原语(在有先后关系的两个进程中),不能次序错误、重复或遗漏,否则同步顺序出错。
并发执行的进程P1和P2中,分别有代码C1和C2,要求C1要在C2开始前完成; 为每对前趋关系设置一个同步信号量S12,并赋初值为0。则只有V操作所在进程获得cpu时能运行。
用可能错误的顺序验证:
ep:
设有一供者和一用者,如何用信号量来控制二者对缓冲区的同步使用。
seamphore s=0;
void main()
{cobegin p1; cobegin p2; }
p1{ f=c1(); signal(s); }
p2{ wat(s); c1(f); }
3、实现计数控制
seamphore s=5(个数,这里假设是5);
void main()
{cobegin p1; cobegin p2; }
p1{wat(s); user r;}
p2{ wat(s); user r;}