目录
读者写者模型
特殊锁
悲观锁
自旋锁
在前几期,我们学习了多线程的生产者和消费者模型,生产者和消费者模型中,有三种关系,两个角色,一个场所,那么读者写者模型和生产者消费者模型有什么关联吗?以此问题,展开本期内容的学习。
读者写者模型
通过一个现实生活中的场景为大家引入读者和写者模型。
小时候,我们上学的时候,每周或者说每学期都会写黑板报,有的同学负责写,有的同学负责读,当有同学在进行写时,其他同学不能写,且其他同学不能读(这里的不能读指的是当写的学生没有写完时,因为没有写完黑板报内容不全),一个同学在读黑板报时,其他同学也可以去读,也可以等这个同学读完之后再去读。
基于以上场景,我们不难发现,读者和写者模型,有1个场所(黑板),两个角色(写者和读者),三种关系(指的是两个角色所构成的关系),读者和读者没有关系,写者和写者是互斥关系,写者和读者是互斥和同步关系。
综上,读者和写者模型图示如下。
读者写者模型相关接口如下。
1.以读者身份加锁。
2.以写者身份加锁。
3.互斥锁的初始化和销毁。
4.读者锁和写者锁的解锁。读者和写者锁的解锁接口统一使用这个接口 。
读者和写者模型伪代码如下。具体实现代码我们不予实现,读者写者内容我们了解即可。
特殊锁
悲观锁
何为悲观锁?
悲观锁我们又称之为挂起等待锁。在多线程场景中往往只有一个锁资源,且当这个锁资源被一个线程获取之后并进行加锁访问临界资源时,其它线程是不能再次进行加锁的,只能被阻塞挂起在阻塞队列中,所以我们称之为悲观锁,也称作挂起等待锁。
在前几期学习的互斥锁的学习中,互斥锁就是一个悲观锁。
自旋锁
自旋锁我们通过一个现实生活中的场景。
场景一:小明和小张准备出去玩,小明已经准备好了,所以提前来到了小张家楼下,打电话问小张是否准备好,小张说还得一个小时,此时小明不继续在小张家楼下去等,而是去了附近的网吧打了一小时游戏,打了一小时游戏之后才去打电话问小张是否准备好,小张也已经准备好了,所以和小张一起出去玩了。
场景二:第二天,小明又准备和小张出去玩,小明也和昨天一样提前准备好来到了小张家楼下,当小明打电话时,小张说还得一分钟,所以此时小明就没有去网吧,而是在楼下等了一分钟,一分钟之内可能由于小张有点磨叽,所以导致小明多次给小张打电话,最终小明和小张一起出去去了外面玩。
上述两种场景,我们发现唯一的区别就是,小明在小张楼下等待的时间的长短以及在等待过程中给小张打电话的间隔。
悲观锁类似于场景一,即得不到锁资源加锁时,挂起在阻塞队列中,不断地去轮询检测锁资源是否准备好,但是这个轮训时间是很长的。自旋锁就类似于场景二,得不到锁资源加锁时,在阻塞等待队列中等待锁资源,但轮询检测的时间间隔是很短的。
基于此,那么悲观锁和自旋锁就有了自身的使用场景。
我们知道,当多线程访问临界资源时,我们一般要对临界资源进行加锁,当线程访问临界资源比较慢时,我们推荐使用悲观锁,当访问临界资源比较快时,我们使用自旋锁。
那么问题来了,当线程访问临界资源时,线程怎么知道自己访问临界资源是否快慢呢?
线程当然不知道,但是我们程序员自然知道,因为临界区的代码是我们程序员写的,所以锁的使用,就需要我们程序员自己去合理的分配。
这便是特殊锁中的悲观锁和自旋锁所有内容。
以上便是本期的所有内容^_^
至此,Linux操作系统篇全部结束,后续将展开Linux网络编程的学习。