这真是一个令我困惑的问题。我试过google很多但仍然不太明白。我的问题是这样的:
对于epoll(),mutex和semaphore等系统调用,它们有一个共同点:一旦发生某些事情(以互斥为例,一个线程释放锁),然后一个线程被唤醒(该线程)等待锁定的人可以被唤醒。
我想知道这个机制(在一个线程中发生了一个事件,然后另一个线程被通知了)在场景后面实现了怎么样?我只想出两种方式:
我不确定我猜哪个是正确的。我想阅读linux源代码可以在这里提供帮助。但对我这样的菜鸟来说有点困难。这里有一个大致的想法加上一些伪代码会很棒。
答案 0 :(得分:1)
当资源变得可用时,另一个线程(无论是用户/内核线程还是由中断处理程序调度的任务 - 那些通常搭载在特殊“工作队列”线程上的任务)调用相关的“唤醒”调用等待队列。 “唤醒”意味着,调度程序应从等待队列链表中删除一个或多个线程控制结构,并将所有这些线程添加到“准备运行”列表中,这将使它们能够在适当的时候进行调度。
这里有一点技术概述: http://www.makelinux.net/ldd3/chp-6-sect-2