您的位置:首页 > 其它

用信号量解决读者写者问题

2016-05-05 11:28 190 查看

问题描述:

多个进程共享一个数据区,这些进程分为两组:

Markdown和扩展Markdown简洁的语法

代码块高亮

读者进程:只读数据区中的数据

写着进程:只往数据区写数据

要求满足的条件:

允许多个读者同时执行读操作

不允许多个写者同时操作

不允许读者、写者同时操作

第一类读者写者问题:读者优先

如果读者执行:

无其他读者、写者,该读者可以读

若已有写者等待,但有其他读者正在读,则该读者也可以读

若有写者正在写,则该读者必须等

如果写者执行

无其他读者、写者,该写者可以写

若有读者正在读,该写者等待

若有其他读者正在写,该写者等待

解法实现:

void reader(void)
{
while(TRUE)
{
P(mutex);
rc = rc + 1;
if(rc == 1)  /*第一个读者*/
{
P(W);    /*不需要每给读者都做*/
}
V(mutex);
读操作;
P(mutex);
rc = rc - 1;
if (rc == 0)/*最后一个读者*/
{
V(w);
}
V(mutex);
其他操作;
}
}

void writer(void)
{
while(TRUE)
{
......
P(W);
写操作;
V(w);
......
}
}


应用实例:

应用场景

如果每个执行实体对临界区的访问或者是读或者是写共享变量,但它们都不会即读又写时,读写锁是最好的选择

实例

LINUX的IPX路由代码中使用了读写锁,用ipx_routes_lock的读写锁保护IPX路由表的并发访问
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息