有没有办法在 EnterCriticalSection()
上设置超时?有 TryEnterCriticalSection()
,但这需要我旋转或使用 Sleep()
。
最佳答案
没有办法对临界区进行定时等待。默认情况下,它的超时时间非常长,而且它是一种调试工具,不适合正常使用。
正如@Remy Lebeau 提到的,您需要使用支持超时的可等待锁。
Mutex 或 Event 对象就是这样的锁,但它们是内核对象,并且没有快速的用户模式路径,就像 Critical Section 那样。
如果您需要使用快速用户模式路径和超时来替换关键部分,您必须创建自己的工具或使用库工具——Windows API 中没有现成的原语。
你可以用SRWLOCK
和CONDITION_VARIABLE
(等待条件变量支持超时),用WaitOnAddress
(它支持超时)创建它, 或者在事件和原子变量之外(提到的最困难的方法,但在 Windows XP 中它是唯一可行的方法)。
库外解决方案,如果您使用的是 C++,请考虑标准库中的 timed_mutex
或 recursive_timed_mutex
。
关于winapi - 设置 EnterCriticalSection 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37952480/