1、问题描述
简而言之就是,对一个共享内存,都可读但只能一个写。
2、读者优先解决方案
读进程只要看到有其他读进程正在访问文件,就可以继续作读访问;写进程必须等待所有读进程都不访问时才能写文件,即使写进程可能比一些读进程更早提出申请。
semaphore mutex = 1;//对readcount保护
semaphore db = 1;//对数据库保护
int readrCount = 0;//正在读或者即将读的数目
void reader(void)
{
while(true)
{
down(&mutex); //获取对readrCount的互斥访问权
readrCount++; //多了一个读者
if(readrCount==1)
down(&db); //如果是第一个读者,则可以与写者互斥抢占数据库
up(&mutex);//释放对readrCount的互斥访问
read_data_base();//访问数据
down(&mutex); //获取对readrCount的互斥访问权
readrCount--; //减少一个读者
if(rcount==0)
up(&db); //如果是最后一个读者,释放数据库所有权
up(&mutex); //释放对readrCount的互斥访问
use_data_read();//非临界区
}
}
void writer
{
while(true)
{
think_up_data();//非临界区
down(&db);
write_data();
up(&db); //释放互斥访问
}
}
当第一是读者的时候,后续如果继续是读者,那么访问,直到所有读者访问完后,才会轮到写者。着有个问题,就是假如读每2s来一个,每个读者花费5s,那么写者用于也不可能进行写操作。