取消阻塞内核线程的正确方法

时间:2019-03-15 07:16:51

标签: c linux kernel

有些linux内核线程会不时进行一些工作,然后进入睡眠状态或阻塞信号量。他们可能会处于这种状态几秒钟-对于线程来说很长一段时间。
如果出于某种原因需要停止线程,至少要卸载它们所属的驱动程序,我正在寻找一种方法,使它们退出睡眠或退出信号灯,而不必等待整个睡眠时间或频繁触发信号灯。必填。

我发现并阅读了很多有关此的内容,但是有很多建议,但我仍然不确定事情如何进行。因此,如果您可以对此有所了解。

msleep_interruptible

什么可以打断呢?

down_interruptible

此信号灯功能表示可中断性。同样在这里,什么可以打断此信号量?

kthread_stop

它被描述为将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?
}

0 个答案:

没有答案