WAIT_TIMEOUT之后如何处理信号量



目前我正在处理一个C++项目,该项目使用以下API创建了一个Semaphore。

m_hSem = ::CreateSemaphore(NULL, 0, 1, NULL);

并使用以下API 检查信号对象是否超时

if (::WaitForSingleObject(m_hSem, 3000) == WAIT_TIMEOUT)
{
//Request time out
}

如果发生超时,那么我需要释放信号量吗?

如果发生超时,那么我需要释放信号量吗?

否,因为等待没有成功地减少信号量的计数器,所以不要释放信号量来增加其计数器。仅当WaitForSingleObject()返回WAIT_OBJECT_0时调用ReleaseSemaphore()

来自微软关于Semaphore Objects:的文档

信号量对象是一个同步对象,它将计数保持在零和指定的最大值之间每当线程完成对信号量对象的等待时,计数就会递减,而每当线程释放信号量时,计数则会递增。当计数达到零时,没有更多的线程可以成功地等待信号量对象状态变为信号状态当信号量的计数大于零时,信号量的状态被设置为有信号,当计数为零时,信号灯的状态被设为无信号。

每当其中一个等待函数返回时,因为信号量的状态被设置为信号量,信号量的计数就会减少一。ReleaseSemaphore函数将信号量的计数增加指定的数量。

如果发生超时,那么我需要释放信号量吗?

否。在这种情况下,等待被视为失败。

文档的措辞有点误导,但示例代码足够清晰。

最新更新