动机:共享数据的访问
两种类型使用者:
读者:不需要修改数据
写者:读取和修改数据
问题的约束
允许同一时间有多个读者,但在任何时候只有一个写者
当没有写者是读者才能访问数据
当没有读者和写者时,写者才能访问数据
在任何时候只有一个线程能操作共享变量
多个并发进程的数据集共享
Rcount:有多少个读者
WriteMutex:写保护
读者优先(信号量的方式)
sem_wait(WriteMutex);
write;
sem_post(WriteMutex);
sem_wait(CountMutex);
if(Rcount==0)
sem_wait(WriteMutex);
++Rcount;
sem_post(CountMutex);
read;
sem_wait(CountMutex);
--Rcount;
if(Rcount==0)
sem_post(WirteMutex)
sem_post(CountMutex)
写者优先(管程方式)
Database::Read()
{
wait until no writers;
read database;
check out - wakr up waiting writers;
}
Database::Write()
{
wait until no readers/writers;
write database;
check out - wake up waiting readers/writers;
}
AR = 0;//Active Readers
AW = 0;//Active Writers
WR = 0;//Wait Readers
WW = 0;//Wait Writers
Condition okToRead;
Condition okToWrite;
Lock lock;
Private Database::StartRead()
{
lock.Acquire();
while((AW+WW)>0)
{
WR++;
okToRead.wait(&lock);
WR--;
}
AR++;
lock.Release;
}
Private Database::DoneRead()
{
lock.Acquire();
AR--;
if(AR==0&&WW>0)
{
okToWrite.signal();
}
lock.Release();
}
}
Private Database::StartWrite()
{
lock.Acquire()
while((AW+AR)>0)
{
WW++;
okToWrite.wait(&lock);
WW--;
}
AW++;
lock.Release();
}
Private Database::DoneWrite()
{
lock.Acquire();
AW--;
if(WW>0)
{
okToWrite.signal();
}
else if(WR>0)
{okToRead.brodcast();
}
lock.Release();
}
Public Database::Write()
{
StartWrite();
write databse;
DoneWrite();
}