waitqueue
简介
等待队列(waitqueue)是实现多线程同步和通信的一种机制。当线程需要获得某种资源,或者达成某种条件时就会使用到它。光听描述的话,它的机制和信号量好像并没什么区别,在某些情况它们确实很类似,但是等待队列也有其特殊的地方,举个例子应该就好理解多了。
我们去理发店理发,发现有人在理发(资源不可用),我们就跟老板说:“等会好了打电话叫我”(将线程挂载进等待队列),然后呢?我们此时并没有老老实实等(当然你也可以老实等待这一家),而是跑到其它理发店并跟老板说,“能理发了就打电话”(加入多个等待队列),然后老老实实等电话就行(等待任意一个队列将线程唤醒)。
通过这个例子我们可以发现,其实加入等待队列后并不会强制让线程等待资源,加入资源的等待队列就等于预约了这个资源,我们可以预约多个资源,只要存在资源可用,那么该资源就会唤醒线程。
线程x加入多个资源的等待队列时:
注意:线程加入等待队列时是尾插,线程y,w,z是后来加入的。
当资源2可用时:
poll函数
简介
poll机制是一种用于处理多个文件事件的通知方法。它允许程序在一个或多个文件描述符上等待事件的发生。
poll工作机制
每当有线程要查询文件状态时,就会将线程加入到对应文件的等待队列中。
当要查询多个文件时,线程也会加入到多个文件的等待队列中,如果存在文件满足目标事件,那么就会将线程从所有文件的等待队列中删除,然后返回满足事件的文件的个数,否则线程将会阻塞等待一段时间再重新检测所有文件的事件状态,直到有文件满足目标事件或等待超时为止。
那如果在线程等待过程中,文件状态改变了怎么办?这时候文件就会将等待队列中第一个线程唤醒,线程会重新检查所有文件的事件状态,如果有文件满足目标事件则退出等待,否则继续等待直到超时。
如果文字描述的还是不够清楚,我们也可以通过流程图去更加形象的了解这个过程:
文章介绍就到此为止啦!
如若有不正确的地方,请大佬指出,小的定会积极改正!