您的位置:首页 > 其它

读者写者问题

2016-04-17 10:57 204 查看
读者优先:

读者进程执行:
无其他读者写者, 直接执行

有写者等, 但其他读者在读, 直接读

有写者写, 等待

写者进程执行:
无其他读写者, 直接执行

有其他读写者, 等待

伪代码描述:

//R: 信号量, 初值为1 , 用于同步读者之间
//mutx: 信号量, 初值为1, 用于互斥读者与写者, 或者写者与写者
//rc: 用于统计当前有多少读者进程
void reader()
{
while (TRUE)
{
P(R);
rc = rc + 1;
if (rc == 1)
P(mutex);
V(R);
读操作
P(R);
rc = rc - 1;
if (rc == 0)
V(mutex);
V(R);
其他操作
}
}

void writer()
{
while (TRUE)
{
P(mutex);
写操作
V(mutex);
}
}


写者优先(这个是我自己想出来的, 不是标准答案, 望指出错误):

读者进程执行:
如果此时没有写者等待, 直接执行

如果有写者等待, 那么等待

写者进程执行:
如果没有其他写者, 那么执行

如果有其他读写者, 那么等待

伪代码描述:

//mutex 信号量: 初值为1, 控制对临界区的访问
//W 信号量: 初值为1 , 用于写者之间同步
//R 信号量: 初值为1 , 用于读者之间同步
//RW 信号量: 初值为1, 用于读者与写者之间同步
//rcount 初值为0 : 用于统计当前有多少读者
//wcount 初值为0 : 用于统计当前有多少写者
void reader()
{
while(true)
{
P(RW) ;
P(R) ;
rcount++ ;
if(rcount == 1)
P(mutex) ;
V(R) ;
V(RW) ;
读操作
P(R) ;
rcount-- ;
if(rcount == 0)
V(mutex) ;
V(R) ;
}
}

void writer()
{
while(true)
{
P(W) ;
wcount++ ;
if(wcount == 1)
P(RW) ;
V(W) ;
P(mutex)
写操作
V(mutex)
P(W) ;
wcount-- ;
if(wcount == 0)
V(RW) ;
V(W) ;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: