首先该问题必须满足下列四个要求:
读者可以共享
写者互斥
除非有一个写者在访问共享数据集,其他情况下,读者不等待
写者执行写操作前,应该让所有读者和写者退出
对于写者来说,只要设置一个写者与写者之间、读者与写者之间共享的一个信号量w即可,w=1;对于读者,需要特殊处理,要求对读者进行计数,因为,读者对文件是共享的,对于第一个读者,需要对数据集“加锁”,防止写者对数据集进行访问,而其他读者可以直接进入访问数据集;对于最后一个读者,需要“解锁”,以便让写者或后面的读者能够访问数据集。读者计数ReadCnt,与之互斥的信号量mutex,初值为0。
程序如下:
typedef int Semaphore
Semaphore mutex = 1, w = 1;
int ReadCnt = 0;
//下面读者与写者进程并发执行
process Reader(void)
{
while(1)
{
P(mutex);
ReadCnt++;
if(1 == ReadCnt)
P(w);
V(mutex);
/*对数据集进行读操作*/
P(mutex);
ReadCnt--;
if(0 == ReadCnt)
V(w);
V(mutex);
}
}
process Writer(void)
{
while(1)
{
P(w);
/*对数据集进行写操作*/
V(w);
}
}