如何强制线程中的一段代码不间断地运行(防止它被操作系统抢占)

本文关键字:运行 操作系统 代码 线程 何强制 一段 不间断 | 更新日期: 2023-09-27 18:04:58

对于给定的任务T,以及代码块(这里用方法封装)m1, m2和m3,

是否有一种方法可以强制它们中的任何一个——比如m2——不间断地运行,也就是说,运行这个程序的线程,在达到它的时间片限制时,如果在执行m2的过程中,不要离开处理器,直到m2完成,才为一个新线程腾出空间?

这可能吗?

的例子:

class Program
    {
        static void Main(string[] args)
        {
            Task task = new Task(() =>
            {
                m1();
                //I want to assure m2 runs uninterruptedly, i.e., that the running thread does not stop while executing m2
                m2();
                m3();
            });
        }
        private static void m1()
        {
            //whatever1...
        }
        private static void m2()
        {
            //whatever2...
        }
        private static void m3()
        {
            //whatever3...
        }
    }

回答每个人的"你为什么想出这个?",当试图找到这个问题的解决方案时,它弹出。我的想法:我需要保证主窗口句柄之间的切换不会被中断/抢占。

对于我的实际问题,这是不是一个合理的解决方案——我认为这个问题值得一问。

如何强制线程中的一段代码不间断地运行(防止它被操作系统抢占)

No。你在抢占式操作系统上运行你的代码,所以你没有能力阻止抢占。

你的真正的问题是什么?试着描述你的实际问题,为什么你会提出这个要求,然后也许有人可以为你的实际问题提供建议。 更新后

记住这个简单的多线程编程的经验法则:线程几乎永远不是正确的答案,事件驱动的编程几乎总是。除非您的CPU密集型计算不能在不同的数据集上扩展,否则很少需要添加线程。生成一个新线程(或任务)只是为了等待IO(导航到URL…)是一种反模式。不幸的是,99.999%的多线程编程示例只是使用线程来简化控制流程。

考虑到这一点,请考虑使用事件驱动模型,例如EventFiringWebDriver。你将只有一个线程,你的主线程,并在其中对你的web驱动程序事件(url下载,标签打开等)作出反应。

在这种情况下,正确的答案取决于你为什么要做你想做的事情。做好这件事比听起来难多了。

一般情况下,是的。有很多方法可以让你做到这一点。然而,从上下文来看,我假设您想知道是否可以在常规Windows操作系统上实现这一点。简短的回答是否定的。Windows有一个抢占式的多任务内核,当时间片结束时,用户进程无法阻止它中断线程。

然而,这并不是故事的全部。你可以将线程的优先级设置为"REALTIME",这将防止它被任何其他线程抢占。调度程序仍然会抢占你的先机,但是因为没有其他人具有更高的优先级,所以它会直接返回给你。这篇文档解释了如何做到这一点。

注意,这是一个坏主意如果管理不当,它将接管整个机器并使其尖叫停止。

对于大多数用户,建议使用多媒体排课服务

如果你真的需要为你的软件提供实时服务(也就是说,能够运行一些关于服务质量的硬保证),你可能会考虑Windows或Linux的实时扩展,或者像vxWorks或QNX这样的完全实时系统之一。

必须切换到支持实时扩展的嵌入式windows版本。即使这样,你也需要从c#切换到本地语言,以便能够使用这些调度功能。

您能做的最好的事情是在m2执行期间更改线程的优先级,以使不太可能被调度掉。然而,如果你要这样做,你不应该使用Task.Run,而是使用实际的Thread对象,你不应该改变ThreadPool线程的优先级(这是Task.Run使用的)。