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