读写优先
动机:
共享数据的访问
使用者:
读者:只读数据集,不需要修改数据
写者:读取和修改数据
原则:
允许同一时间有多个读者,但在任何时候只有一个写者
当没有写者时,读者才能访问数据
当没有读者和写者时,写者才能访问数据
在任何时候只有一个线程可以操作共享变量
读者优先
信号量实现
sem_t WriteMutex= 1;
sem_t CountReadMutex= 1;
int RCount= 0;
Reader()
{
sem_wait(CountReadMutex);
if(RCount ==0)
sem_post(WriteMutex);
++RCount;
sem_post(CountReadMutex);
read;
sem_wait(CountReadMutex);
--RCount;
if(RCount ==0)
sem_post(WriteMutex);
sem_post(CountReadMutex);
}
Writer()
{
sem_wat(WriteMutex);
write;
sem_post(WriteMutex);
}
管程实现
int AR = 0; //active reader
int AW = 0; //active writer
int WR = 0; //waiting reader
int WW = 0; //waiting writer
Condition okToRead, okToWrite;
Lock lock;
Read()
{
BeginRead();
read;
EndRead();
}
BeginRead()
{
lock.acqure();
while((AW)>0)//当写者正在写时,读者等待
{
++WR;
okToRead.wait(&lock);
--WR;
}
++AR;
lock.release();
}
EndRead()
{
lock.acqure();
--AR;
if(AR==0 && WW>0)
{
okToWrite.signal();
}
lock.release();
}
Write()
{
BeginWrite();
Write;
EndWrite();
}
BeginWrite()
{
lock.acqure();
while((AR+AW+WR)>0)//当有读者在读 或 写者在写,或者读者在等时,都等待
{
++WW;
okToWrite.wait(&lock);
--WW;
}
++AW;
lock.release();
}
EndWrite()
{
lock.acqure();
--AW;
if(WR>0) //优先等待的读者
{
okToRead.broadcast();
}
else if(WW>0)
{
okToWrite.signal();
}
lock.release();
}
写者优先:
信号量实现
sem_t RWMutex = 1;
sem_t WriteMutex= 1;
sem_t CountReadMutex= 1;
sem_t CountWriteMutex= 1;
int RCount = 0;
int WCount = 0;
Reader()
{
sem_wat(RWMutex);
sem_wait(CountReadMutex);
if(RCount ==0)
sem_post(WriteMutex);
++RCount;
sem_post(CountReadMutex);
sem_post(RWMutex);
read;
sem_wait(CountReadMutex);
--RCount;
if(RCount ==0)
sem_post(WriteMutex);
sem_post(CountReadMutex);
}
Writer()
{
sem_wait(CountWriteMutex);
if(WCount ==0)
sem_post(RWMutex);
++WCount ;
sem_post(CountWriteMutex);
sem_wat(WriteMutex);
write;
sem_post(WriteMutex);
sem_wait(CountWriteMutex);
--WCount ;
if(WCount ==0)
sem_post(RWMutex);
sem_post(CountWriteMutex);
}
管程实现
int AR = 0; //active reader
int AW = 0; //active writer
int WR = 0; //waiting reader
int WW = 0; //waiting writer
Condition okToRead, okToWrite;
Lock lock;
Read()
{
BeginRead();
read;
EndRead();
}
BeginRead()
{
lock.acqure();
while((AW+WW)>0)
{
++WR;
okToRead.wait(&lock);
--WR;
}
++AR;
lock.release();
}
EndRead()
{
lock.acqure();
--AR;
if(AR==0 && WW>0)
{
okToWrite.signal();
}
lock.release();
}
Write()
{
BeginWrite();
Write;
EndWrite();
}
BeginWrite()
{
lock.acqure();
while((AR+AW)>0)
{
++WW;
okToWrite.wait(&lock);
--WW;
}
++AW;
lock.release();
}
EndWrite()
{
lock.acqure();
--AW;
if(WW>0)
{
okToWrite.signal();
}
else if(WR>0)
{
okToRead.broadcast();
}
lock.release();
}
posted on 2022-01-08 13:44 BraveMrFeng 阅读(44) 评论(0) 收藏 举报
浙公网安备 33010602011771号