我知道我们可以使用pthread_cond_init
,pthread_cond_wait
和pthread_cond_broadcast
在用户空间中实现线程状态信令。但是我们如何在使用kthread
的内核模块中实现它呢?
linux/mutex.h提供了如in this question所述的锁定。但这似乎与任何条件变量都没有关联。
linex/wait.h似乎正在等待条件,但是它没有文档,因此周围有太多顾虑。例如,按照examples with no mutex中的建议使用时,wake_up_interruptable
可能具有竞争条件。似乎不太可能将等待队列与互斥体等待以能够实现pthread_cond_wait
之类的语义的方式组合在一起,因为实现这些不同API的线程调度功能需要集成以提供原子语义。
内核模块如何获得原子的睡眠和解锁语义,例如在普通的用户空间API中,例如pthread_cond_wait
?
我需要的特定语义是(来自pthread_cond_wait*
manpage):
这些函数自动释放 mutex 并导致调用线程 阻止条件变量 cond ;原子地意味着 “从原子上讲,是关于另一个线程对互斥锁的访问, 然后是条件变量”。也就是说,如果另一个线程能够 在大约要阻塞的线程释放互斥锁之后,获取该互斥锁, 然后随后调用 pthread_cond_broadcast ()或 该线程中的 pthread_cond_signal ()的行为应类似于已发出 在大约要阻塞的线程被阻塞之后。
重要要求是:
(Here是pthread_cond_wait
在程序中的用法)。