C语言 非阻塞 Win32 系统调用(如 ReleaseMutex)是否会导致线程阻塞并允许较低优先级的线程运行?



我遇到了一个问题,即线程以某种方式被低优先级线程抢占,尽管优先级较高的线程不会进行任何阻塞调用。我注意到,当优先级较低的线程抢占优先级较高的线程时,优先级较高的线程处于系统调用的中间。具体来说,ReleaseMutex 和 Sleep(0(。系统调用是否有可能正在执行会阻止当前线程并允许较低优先级线程运行的操作?

优先级只是意味着一个线程比另一个线程有一定程度的偏好。总是会出现这样的情况:线程由于某种原因无法向前推进,然后优先级较低的线程抢占它。

例如,想象一下,如果由于一些奇怪的边缘情况,ReleaseMutex碰巧出现在一些罕见的代码路径中,并且用于处理该边缘情况的代码已分页到磁盘。调用ReleaseMutex的线程在该代码分页之前尚未准备好运行,因此优先级较低的线程可以获取 CPU。

我不认为这是一个特别可能的情况。但关键是它不能保证不会发生。优先级不是排除方法或同步机制。这只是当系统碰巧有选择时指示您喜欢什么的一种方式。

如果这给您带来了问题,那么您的设计中存在非常错误。如果您尝试使用线程优先级作为保证特定行为(而不是指示首选项(的一种方式,那么您处理排除是完全错误的。

最新更新