如何告诉linux中的线程调度程序出于任何原因不打断你的线程?我在用户模式下编程。简单地锁定互斥锁是否可以实现这一点?我希望防止在执行某个函数时调度进程中的其他线程。它们会阻塞,我会浪费带有上下文切换的cpu周期。我希望执行该函数的任何线程能够在不中断的情况下完成执行,即使超出了线程的时间片。
答案 0 :(得分:10)
如何告诉linux中的线程调度程序出于任何原因不打断你的线程?
无法真正完成,你需要一个实时系统。你将获得关于linux的关闭的东西是 将调度策略设置为实时调度器,例如, SCHED_FIFO,还设置了PTHREAD_EXPLICIT_SCHED属性。参见例如here,即使是现在,例如irq处理程序和其他东西会中断你的线程并运行。
但是,如果您只关心自己进程中的线程无法执行任何操作,那么是的,让它们阻塞正在运行的线程保持的互斥锁就足够了。
困难的部分是协调所有其他线程,以便在线程需要执行其操作时获取该互斥锁。
答案 1 :(得分:2)
你应该构建你的sw,这样你不依赖于调度程序从你的应用程序的角度做“正确”的事情。调度程序很复杂。它会做它认为最好的事情。
上下文切换很便宜。你说
我会浪费带有上下文切换的cpu周期。
但你不应该那样看。使用互斥锁和阻塞/等待进程的多线程机制。机器在那里供你使用......
答案 2 :(得分:1)
你做不到。如果你能做什么会阻止你的线程永远不会释放请求并使其他线程挨饿。
您可以做的最好的事情是将线程设置为优先级,以便调度程序优先于优先级较低的线程。
答案 3 :(得分:1)
为什么不简单地让竞争线程阻塞,那么调度程序将没有任何剩余的时间来安排你的生活线程?为什么第二次猜测调度程序会使设计复杂化?
答案 4 :(得分:1)
了解Linux下的实时调度。我从来没有这样做过,但是如果你确实需要这个,那么就像你在用户应用程序代码中得到的那样。
你似乎害怕的并不是那么大的交易。您无法阻止内核中断您的程序以获得真正的中断或更高优先级的任务想要运行,但是通过定期调度,内核确实使用了它自己的计算优先级值,这几乎可以处理您担心的大部分问题。如果线程A独占地保存资源X(X可以是锁定)并且线程B在资源X上等待变为可用,那么A的有效优先级将至少与B的优先级一样高。它还考虑了进程是否正在使用大量的cpu,或者是否花费大量时间来计算优先级。当然,也有很好的价值。