一个数据文件或记录,可被多个进程共享,我们把只要求读该文件的进程称为“Reader进程”,其他进程则称为“Writer 进程”。
1.允许多个进程同时读一个共享对象,因为读操作不会使数据文件混乱。
2.但不允许一个 Writer 进程和其他 Reader 进程或 Writer 进程同时访问共享对象,因为这种访问将会引起混乱。
一。如果只有一个读者和一个写者我们很容易写下代码
void reader()
{
while(1)
{
P(mutex);
//读操作
V(mutex);
}
}
void writer()
{
while(1)
{
P(mutex);
//写操作
V(mutex);
}
}
二。如果有多个读者,和一个写者,当读者占有共享区时怎么判断下一个想要使用共享区的是读者呢?使用计数,当计数不为0时,表示当前是读者。新来的读者就可以直接读了。
void reader()
{
while(1)
{
P(rmutex);
if(readercount==0)//mean the first
P(mutex);
readercount++;
V(rmutex);
//读操作
P(rmutex)
readercount--;
if(readercount==0)//只有一个的话就要释放对共享区的控制
V(mutex);
V(rmutex);
}
}
void writer()
{
while(1)
{
P(mutex);
//读操作
V(mutex);
}
}
简单的同步问题:
描述:
如何实现两个进程一个控制完共享区,另一个接着控制,交换进行,可以规定哪个在前哪个在后
mutex=1;empty=1;
full=0;
void father()
{
while(1)
{
P(empty)
//put apple
V(full);
}
}
void son()
{
while(1)
{
P(full);
//getapple;
V(empty);
}
}
如何实现生产者消费者问题:
semapthore mutex=1;
semapthore empty=10;
semapthore full=0;
void produce()
{
while(1)
{
P(empty)//判断是否有空闲的地方
P(mutex)
//put something
V(mutex)
V(full)//增加了一个物品
}
}
void consum()
{
while(1)
{
P(full);//是否有货
P(mutex)
//get something
V(mutex)
V(empty)
}
}
桌上有一只盘子,允许存放一个水果,父亲专向盘中放苹果,母亲专向盘中放桔子,儿子专等吃盘里的桔子,女儿专等吃盘里的苹果。只要盘子空,则父亲或母亲可向盘中放水果,仅当盘中有自己需要的水果时,儿子或女儿可从中取出。
1父亲、母亲要互斥使用盘子,所以两者之间是互斥关系;
2父亲放的苹果,女儿吃,所以两者是同步关系;
3母亲放的桔子,儿子吃,所以两者也是同步关系。
semaphore S_Plate=1, S_Apple=0, S_Orange=0;
void father( ) // 父亲进程
{
while(1)
{
P(S_Plate);//这个是为了和妈妈区别这个谁来使用
往盘子中放入一个苹果;
V(S_Apple);
}
}
void mother( ) // 母亲进程
{
while(1)
{
P(S_Plate);
往盘子中放入一个桔子;
V(S_Orange);
}
}
void son( ) // 儿子进程
{
while(1)
{
P(S_Orange);
从盘中取出一个桔子;
V(S_Plate);
吃桔子;
}
}
void daughter( ) // 女子进程
{
while(1)
{
P(S_Apple);
从盘中取出一个苹果;
V(S_Plate);
吃苹果;
}
}