WaitForSingleObject:不锁定互斥量但检查当前状态?
WaitForSingleObject: do not lock a mutex but check the current state?
我目前正在使用 WaitForSingleObject((HANDLE)handle,INFINITE)
函数来互斥锁定我的代码的某些部分。
现在我有一种情况,我不想锁定它,只是想看看它是否处于锁定状态。使用 POSIX 我可以用 pthread_mutex_trylock()
做到这一点 - 当它失败时,我知道这个互斥体已经有一个锁。
那么:如何使用 WaitforSingleObject()
-call 完成此操作?我怎样才能知道相关的互斥量是否已经被锁定?
我想这与 dwMilliseconds
参数有关,但我不明白如何确定它是被锁定还是由于其他锁定而刚刚返回...
WaitForSingleObject
(函数系列)用于在等待各种类型的 Windows 句柄时有效地将线程置于睡眠状态。线程的执行将等到函数完成 returned。在使用互斥量的最简单情况下,这些函数还请求锁定。该线程将保持互斥锁锁定,直到您调用 ReleaseMutex
.
dwMilliseconds
仅指定等待超时。通常你应该在这里使用常量INFINITE
。您还可以将值 0 传递给 dwMilliseconds
以使函数检查句柄的状态并立即 return 并继续执行。如果它 returns WAIT_OBJECT_0
(或等效的),你有互斥锁。这相当于 pthread_mutex_trylock
.
如果您确实指定了超时,WaitForSingleObject
将在指定时间段内未获得请求的句柄时 return 超时状态 WAIT_TIMEOUT
。在WaitForMultipleObjects
的情况下,您还需要检查结果以查看您得到的是哪个对象。
来自 MSDN 的示例:https://docs.microsoft.com/en-us/windows/win32/sync/using-mutex-objects
没有 "peeking" 互斥量的当前状态。要么锁定互斥量,要么不锁定,就没有窥视。
pthread_mutex_trylock()
总是立即 returns 并且无论互斥量是否已被锁定都不会阻塞调用线程。但是,如果互斥量没有被锁定并且 trylock
成功,那么锁定已经获得,您必须解锁它。您必须检查 return 值才能知道是哪种情况。
要复制与 WaitForSingleObject()
相同的行为,只需将超时设置为 0,这样它就会立即退出而不会阻塞。如果互斥量尚未锁定且等待成功,则获得锁定并且您必须解锁它。同样,您必须检查 return 值。
注意:pthread 互斥锁和 Win32 互斥锁之间存在细微但重要的区别。 Win32 互斥量 总是 递归。当一个线程已经锁定了一个 Win32 互斥量时,它可以安全地重新锁定同一个互斥量而不会阻塞自己。每次互斥锁被重新锁定时,内部锁计数都会增加,并且线程只需要解锁互斥锁的次数与它(重新)锁定的次数一样多,以便释放互斥锁以供其他线程锁定。另一方面,pthread 互斥体只有当互斥体创建者在调用 pthread_mutex_init()
时明确请求它时才是递归的。因此,请小心使用(重新)锁定以避免代码死锁。
我目前正在使用 WaitForSingleObject((HANDLE)handle,INFINITE)
函数来互斥锁定我的代码的某些部分。
现在我有一种情况,我不想锁定它,只是想看看它是否处于锁定状态。使用 POSIX 我可以用 pthread_mutex_trylock()
做到这一点 - 当它失败时,我知道这个互斥体已经有一个锁。
那么:如何使用 WaitforSingleObject()
-call 完成此操作?我怎样才能知道相关的互斥量是否已经被锁定?
我想这与 dwMilliseconds
参数有关,但我不明白如何确定它是被锁定还是由于其他锁定而刚刚返回...
WaitForSingleObject
(函数系列)用于在等待各种类型的 Windows 句柄时有效地将线程置于睡眠状态。线程的执行将等到函数完成 returned。在使用互斥量的最简单情况下,这些函数还请求锁定。该线程将保持互斥锁锁定,直到您调用 ReleaseMutex
.
dwMilliseconds
仅指定等待超时。通常你应该在这里使用常量INFINITE
。您还可以将值 0 传递给 dwMilliseconds
以使函数检查句柄的状态并立即 return 并继续执行。如果它 returns WAIT_OBJECT_0
(或等效的),你有互斥锁。这相当于 pthread_mutex_trylock
.
如果您确实指定了超时,WaitForSingleObject
将在指定时间段内未获得请求的句柄时 return 超时状态 WAIT_TIMEOUT
。在WaitForMultipleObjects
的情况下,您还需要检查结果以查看您得到的是哪个对象。
来自 MSDN 的示例:https://docs.microsoft.com/en-us/windows/win32/sync/using-mutex-objects
没有 "peeking" 互斥量的当前状态。要么锁定互斥量,要么不锁定,就没有窥视。
pthread_mutex_trylock()
总是立即 returns 并且无论互斥量是否已被锁定都不会阻塞调用线程。但是,如果互斥量没有被锁定并且 trylock
成功,那么锁定已经获得,您必须解锁它。您必须检查 return 值才能知道是哪种情况。
要复制与 WaitForSingleObject()
相同的行为,只需将超时设置为 0,这样它就会立即退出而不会阻塞。如果互斥量尚未锁定且等待成功,则获得锁定并且您必须解锁它。同样,您必须检查 return 值。
注意:pthread 互斥锁和 Win32 互斥锁之间存在细微但重要的区别。 Win32 互斥量 总是 递归。当一个线程已经锁定了一个 Win32 互斥量时,它可以安全地重新锁定同一个互斥量而不会阻塞自己。每次互斥锁被重新锁定时,内部锁计数都会增加,并且线程只需要解锁互斥锁的次数与它(重新)锁定的次数一样多,以便释放互斥锁以供其他线程锁定。另一方面,pthread 互斥体只有当互斥体创建者在调用 pthread_mutex_init()
时明确请求它时才是递归的。因此,请小心使用(重新)锁定以避免代码死锁。