读者、写者问题
- 任意数量的读者可以同时读取数据;
- 每次只有一个写者在写数据;
- 当写者在写数据时,不允许读者去读数据;
可用于解决多个进程共享一个数据区(文件,内存区,一组寄存器等),其中若干读进程只能读数据,若干写进程只能写数据等实际问题;
读者优先
- 指一旦有读者正在读数据,允许多个读者同时进入读数据,只有当全部读者退出后,才允许写者进入写数据。
- 容易导致写者饥饿;
比如飞机订票系统,500人正在查询从成都飞往深圳的余票。此时余票只有3张,那么读者优先就会让500人都去查询,每个人都以为还有余票,每个人都等所有人查询完了,付款系统才开始执行最后改写余票数量,最后买到票的只有三个人,其他497人都在白等。
写者优先
- 只要有一个写者申请写数据,则不再允许新的读者进入读数据;
互斥总结
- 利用wait、signal原语对信号量操作实现,非常实用;
- 可用软件方法实现互斥,如Dekker算法,Peterson算法等(容易出错,但增加处理负荷);
- 也可以用硬件方法或固件方法实现互斥,如屏蔽中断,Test and Set指令等(属于可接受的忙等);