深入浅出等待队列和poll机制

文章探讨了等待队列在多线程同步中的作用,类比理发店预约资源,解释了线程如何灵活调度。同时介绍了poll机制,用于处理多个文件事件通知,包括线程阻塞和唤醒的过程。
摘要由CSDN通过智能技术生成

waitqueue

简介

等待队列(waitqueue)是实现多线程同步和通信的一种机制。当线程需要获得某种资源,或者达成某种条件时就会使用到它。光听描述的话,它的机制和信号量好像并没什么区别,在某些情况它们确实很类似,但是等待队列也有其特殊的地方,举个例子应该就好理解多了。

我们去理发店理发,发现有人在理发(资源不可用),我们就跟老板说:“等会好了打电话叫我”(将线程挂载进等待队列),然后呢?我们此时并没有老老实实等(当然你也可以老实等待这一家),而是跑到其它理发店并跟老板说,“能理发了就打电话”(加入多个等待队列),然后老老实实等电话就行(等待任意一个队列将线程唤醒)。

通过这个例子我们可以发现,其实加入等待队列后并不会强制让线程等待资源,加入资源的等待队列就等于预约了这个资源,我们可以预约多个资源,只要存在资源可用,那么该资源就会唤醒线程。
线程x加入多个资源的等待队列时:
image.png

注意:线程加入等待队列时是尾插,线程y,w,z是后来加入的。

当资源2可用时:
image.png

poll函数

简介

poll机制是一种用于处理多个文件事件的通知方法。它允许程序在一个或多个文件描述符上等待事件的发生。

poll工作机制

每当有线程要查询文件状态时,就会将线程加入到对应文件的等待队列中。
image.png
当要查询多个文件时,线程也会加入到多个文件的等待队列中,如果存在文件满足目标事件,那么就会将线程从所有文件的等待队列中删除,然后返回满足事件的文件的个数,否则线程将会阻塞等待一段时间再重新检测所有文件的事件状态,直到有文件满足目标事件或等待超时为止。
那如果在线程等待过程中,文件状态改变了怎么办?这时候文件就会将等待队列中第一个线程唤醒,线程会重新检查所有文件的事件状态,如果有文件满足目标事件则退出等待,否则继续等待直到超时。
如果文字描述的还是不够清楚,我们也可以通过流程图去更加形象的了解这个过程:image.png
文章介绍就到此为止啦!
如若有不正确的地方,请大佬指出,小的定会积极改正!

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值