吸烟者问题
假设一个系统中有三个吸烟者进程和一个供应者进程,每个抽烟者不停的卷烟并抽掉它,但是要卷烟并抽调一支烟
抽烟者需要三种材料:烟草 卷纸 胶水 三个抽烟者中第一个拥有烟草,第二个拥有卷纸 第三个拥有胶水
供应者进程不停的供应三种材料,供应者每次将两种材料放在桌子上,拥有剩下的那种材料的抽烟者卷一根抽掉它
并通知供应者进程一个信号完成了。供应者进程就会将两种材料藏在桌上 这个过程一直重复(三个抽烟者轮流吸烟)
从题中我们得到 每次放两种材料 其实我们可以认为每次放一组材料 一共三组
组合1:卷纸+胶水
组合2:烟草+胶水
组合3:烟草+卷纸
然后我们就思考 我们设置三个变量offer1 offer2 offer3 这三个变量分别表示桌上组合123的数量
直接给出大家代码参考
semaphore offer1=0;桌子上的组合1的数量
semaphore offer2=0;桌子上的组合2的数量
semaphore offer3=0;桌子上的组合3的数量
semaphore finish=0;抽烟是否完成
int i=0;用于实现三个抽烟者轮流抽烟的 功能
provider(){
while(1){
if(i==0){
V(offer1);//提供第一组材料
}
else if(i==1){
V(offer2);//提供第二组材料
}
else if(i==2){
V(offer3);//提供第三组材料
}
i=(i+1)%3;
P(finish);//如果未完成会一直阻塞在这里
}
}
smoker1(){
P(offer1);
从桌子上拿走组合1
V(finish);
}
somker2(){
P(offer2);
从桌子上拿走组合2
V(finish);
}
smoker3(){
P(offer3);
从桌子上拿走组合3
V(finish);
}
代码就是上述
这个问题的实质上就是可以生产多个产品的单生产者
读写者问题
有读者和写着两组并发进程,共享一个文件,当两个或者两个以上的读进程共享数据的时候并不会发生副作用
但若是某个写进程和其他进程(读或写)同时访问共享数据的时候,可能导致数据不一致的错误
因此要求:
1.允许多个读者同时对文件执行读操作
2.只允许一个写者往文件中写信息
3.任何一个写着在写操作完成之前,不允许其他读者或者写者工作
4.写者执行写操作之前 应让所有的读者和写者退出
这个问题可以说是比较复杂的一个问题了
semaphore rw=1;//用于实现对文件的访问互斥
int count=0;//记录当前有几个进程在同时读文件
semaphore mutex=1;//保证对于count变量的互斥访问
semaphore w=1;//实现“写优先”
writer(){
while(1){
P(w);//实现写优先
P(rw);//对文件的访问的互斥
写文件
V(rw);
V(w);
}
}
reader(){
while(1){
P(w);//实现写优先
P(mutex);//保证count的计数是互斥的
if(count==0)
P(rw);//对文件访问的互斥
}
count++;
V(mutex);
读文件
P(mutex);
count--;
if(count==0)
V(rw);//最后一个读者负责解锁
V(mutex);
}
我们举个例子 假如第一个进程是读进程 第二个是写进程 第三个还是读进程
按照上边的代码
写进程开始是被阻塞的(第一个读进程结束之前)
然后就执行写进程
但是 虽然说我们写的是写优先
但是 如果第一个是写进程,第二个是读进程,第三个是写进程
它的执行顺序还是 上述的进程顺序
并不是写进程优先(先来先服务的顺序)
这篇博客的读写者问题真的挺难理解的 希望我所写的对大家有帮助