防止线程被非预定

时间:2014-05-13 14:16:25

标签: multithreading winapi

我尝试使用winapi实现阻止线程被其他正在运行的线程(在单个进程内)中断的东西。

我的第一个ID是将此线程置于更高的优先级,关于文档(来自http://msdn.microsoft.com/en-us/library/windows/desktop/ms685100%28v=vs.85%29.aspx)它应该阻止其他文件被执行(当然,如果我的线程没有落到任何WAIT状态)。

但是,我无法理解为什么,其他线程仍然在此之后安排"技巧"。

除了在所有其他线程上使用SuspendThread()之外,我无法获得任何其他想法...

有更清洁的方法吗?或者您对我的问题有任何建议吗?

1 个答案:

答案 0 :(得分:0)

线程是在OS范围内调度的,不仅适用于一个进程。您可以将prio更改为31.这将是最高的...但如果其他线程也与prio 31一起运行,您的线程也将中断...此外,所有硬件事件(IRQ)将具有比31更高的prio。 ..

如果您只想拥有一个"流程范围内"解决方案,我建议使用Fibers。使用光纤,您可以自己进行安排,也可以预防"其他"纤维"到"中断"你的任务。当然,它可能仍会被打断"通过另一个线程。但是如果你用prio 31运行你的线程,这应该不是什么大问题....

在这种情况下,我们使用Profibus连接运行非常高响应(几乎)的实时系统......此外,SQL服务器正在使用光纤模式进行优化和高性能模式。

或者,您可以修改(限制)所有其他进程(SetProcessAffinityMask)的进程关联掩码!要修改所有进程,您需要以SYSTEM身份启动流程(例如通过服务)。

如果您只关心自己的流程,可以在自己的流程中修改(限制)所有其他线程(SetThreadAffinityMask)的线程亲和力!

请注意,限制您的重要信息是没有意义的。线程到特定的CPU!这只会限制你的线程。但是你必须限制所有其他线程/进程才能获得重要的"最好的表现!

另请注意,您永远不应该考虑使用SuspendThread!这可能导致死锁......另请参阅:http://blog.kalmbachnet.de/?postid=6 / http://blog.kalmbachnet.de/?postid=16