winapi - 设置 EnterCriticalSection 超时

标签 winapi concurrency locking critical-section

有没有办法在 EnterCriticalSection() 上设置超时?有 TryEnterCriticalSection(),但这需要我旋转或使用 Sleep()

最佳答案

没有办法对临界区进行定时等待。默认情况下,它的超时时间非常长,而且它是一种调试工具,不适合正常使用。

正如@Remy Lebeau 提到的,您需要使用支持超时的可等待锁。

Mutex 或 Event 对象就是这样的锁,但它们是内核对象,并且没有快速的用户模式路径,就像 Critical Section 那样。

如果您需要使用快速用户模式路径和超时来替换关键部分,您必须创建自己的工具或使用库工具——Windows API 中没有现成的原语。

你可以用SRWLOCKCONDITION_VARIABLE(等待条件变量支持超时),用WaitOnAddress(它支持超时)创建它, 或者在事件和原子变量之外(提到的最困难的方法,但在 Windows XP 中它是唯一可行的方法)。

库外解决方案,如果您使用的是 C++,请考虑标准库中的 timed_mutexrecursive_timed_mutex

关于winapi - 设置 EnterCriticalSection 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37952480/

相关文章:

c - GCC 中的互斥锁在哪里定义?

java - ReentrantReadWriteLock返回的锁是否等同于它的读写锁?

c++ - 为什么我的非所有者绘制的列表框在添加字符串后出现绘图问题?

c++ - 将 ETW 事件发送到全局 "Application"日志

Objective-C:完全检索原子属性

java - Apache Camel : Reply received for unknown correlationID

windows - 主要 token 和模拟 token 之间有什么区别

c++ - 所有者绘制菜单的自定义背景

concurrency - Nim 线程间消息传递 : How to avoid a global TChannel?

c# - 当存在上下文切换时,获取锁的开销是否取决于操作系统计时器分辨率?