有些linux内核线程会不时进行一些工作,然后进入睡眠状态或阻塞信号量。他们可能会处于这种状态几秒钟-对于线程来说很长一段时间。
如果出于某种原因需要停止线程,至少要卸载它们所属的驱动程序,我正在寻找一种方法,使它们退出睡眠或退出信号灯,而不必等待整个睡眠时间或频繁触发信号灯。必填。
我发现并阅读了很多有关此的内容,但是有很多建议,但我仍然不确定事情如何进行。因此,如果您可以对此有所了解。
什么可以打断呢?
此信号灯功能表示可中断性。同样在这里,什么可以打断此信号量?
它被描述为将kthread_should_stop设置为true并将其唤醒... ,但是此函数将一直阻塞,直到睡眠时间结束(即使使用msleep_interruptible)或信号量也被触发。
我理解错了什么?
我的搜索发现一个信号可以中断线程。其他热门消息说,信号不是在线程上操作的最佳方法。
如果信号是最佳选择-我应该使用哪个信号来解除线程阻塞,但又不要弄乱它呢?
SIGINT是终止信号-我不打算终止某些东西,只是继续进行下去。
线程运行一个循环,该循环检查终止标志,执行一些工作,然后阻塞睡眠或信号量。它们用于
情况1.
使用信号量使生产者和使用者同步的生产者-消费者方案。它们可以完美地使线程等待工作并开始在设置信号量上运行。
当前,我正在设置终止标志,然后设置信号量。这将取消阻塞线程,然后线程将检查标志并终止。这不是我的主要问题。当然,我想知道一种更好的方法。
代码示例
while (keep_running) {
do_your_work();
down_interruptible(&mysemaphore); // Intention: break out of this
}
情况2。
定期记录事物的线程。在工作之间,该线程会休眠几秒钟。设置该标志后,该线程在下一次运行时终止,但这可能需要几秒钟。如果需要,我想睡一觉。
代码示例
while (keep_running) {
do_your_work();
msleep(15000); // Intention: break out of this - msleep_interruptible?
}