如何用kthread实现线程条件?

时间:2019-07-04 05:00:16

标签: c multithreading linux-kernel mutex

我知道我们可以使用pthread_cond_initpthread_cond_waitpthread_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 ()的行为应类似于已发出   在大约要阻塞的线程被阻塞之后。

重要要求是:

  • 该条件是一个共享结构,仅当持有互斥量时才能访问。
  • 原子性可防止互斥体释放和线程阻塞之间的条件变为真。没有这个,线程可以检查条件(当它为假时),然后释放互斥体,然后条件变为真(并且生成并传播信号),然后线程进入睡眠状态并错过信号。

Herepthread_cond_wait在程序中的用法)。

0 个答案:

没有答案