【发布时间】: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