【问题标题】:Setting EnterCriticalSection timeout设置 EnterCriticalSection 超时
【发布时间】:2016-06-21 18:57:03
【问题描述】:

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

【问题讨论】:

  • 这是唯一的方法。如果你想要一个更好的计时器,你将不得不使用更重的同步对象,比如互斥锁。
  • 这不是完全正确的。 EnterCriticalSection() 文档说:“”如果对关键部分的等待操作超时,此函数可以引发 EXCEPTION_POSSIBLE_DEADLOCK。 超时间隔由以下注册表值指定:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CriticalSectionTimeout“CriticalSection 确实包含一个可等待对象,因此理论上您可以通过超时直接等待它(我不会不过不建议这样做)。该对象通常是在争用期间按需创建的,但您可以预先创建它...
  • ... 也就是说,如果您需要使用带超时的可等待锁,最好使用真正支持它的锁,例如互斥锁或事件。

标签: winapi concurrency locking critical-section


【解决方案1】:

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

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

Mutex 或 Event 对象就是这样的锁,但它们是内核对象,并且不像关键部分那样具有快速的用户模式路径。

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

您可以从SRWLOCKCONDITION_VARIABLE(条件变量等待支持超时)、WaitOnAddress(它支持超时)或事件和原子变量(最难提及的方式,但在 Windows XP 中它是唯一有效的)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 2023-03-03
    • 2011-02-17
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多