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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非阻塞的Win32系统调用(例如ReleaseMutex)会导致线程阻塞并允许较低优先级的线程运行吗?相关的知识,希望对你有一定的参考价值。

我遇到一个问题,尽管优先级较高的线程不会进行任何阻塞调用,但优先级较低的线程会抢占线程。我注意到,当优先级较低的线程确实抢占了优先级较高的线程时,优先级较高的线程位于系统调用的中间。具体来说,是ReleaseMutex和Sleep(0)。系统调用是否可能会执行某些操作,从而阻塞当前线程并允许优先级较低的线程运行?

答案

优先级只表示一个线程相对于另一个线程有一定的优先级。总是可能由于某种原因某个线程无法前进,然后优先级较低的线程将其抢占。

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

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

如果这导致您遇到问题,则说明您的设计中存在非常错误的地方。如果您尝试使用线程优先级作为保证特定行为的一种方式(而不是指示首选项),那么您将完全排除错误。

以上是关于非阻塞的Win32系统调用(例如ReleaseMutex)会导致线程阻塞并允许较低优先级的线程运行吗?的主要内容,如果未能解决你的问题,请参考以下文章

转载使用Win32API实现Windows下异步串口通讯

连续 MPI 非阻塞调用

非阻塞IO可以等同异步IO嘛?

如何避免阻塞(C++、Win32)

非阻塞系统调用可以中断吗?

同步异步与阻塞非阻塞