本文主要是介绍用信号量解决读者写者问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题描述:
多个进程共享一个数据区,这些进程分为两组:
- 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路由表的并发访问
这篇关于用信号量解决读者写者问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!