我有5个线程(在多核系统上)同时等待:
我使用WaitForMultipleObjectsEx(..., TRUE, INFINITE, TRUE)
因为线程使用了APC
请注意,APC 不以任何方式使用/ touch / alter /观察互斥锁或事件。
我使用Visual Studio和Process Hacker进行调试,我目睹了一种奇怪的现象:
通常,假定运行的线程(称之为线程A)仍然在等待这两个对象。
我说"应该跑#34;这是因为:
然而,根据Process Hacker(使用NtQueryMutant
to retrieve the count),在这种情况下,M有一个荒谬的低" Count"值,例如-618。
当然,我不会忘记致电ReleaseMutex
(是的,我也会检查返回值);事实上,一旦有人后来获得互斥锁,计数就会增加。
所以这引出了一个问题:如果其他4个线程中有3个正在休眠,那么最后一个线程(B)在做什么?
答案是B在WaitForMultipleObjectsEx
电话中正在执行APC 。
无论我走了多远步骤"通过Visual Studio中的B (甚至一直备份RtlDispatchAPC
),其他线程的无唤醒。
只有在之后,APC已经完成执行,任何线程都会被唤醒!
我觉得这很奇怪,WaitForMultipleObjectEx
's documentation says:
当
bWaitAll
为TRUE
时,仅当所有对象的状态都已设置为已发信号时,才会完成函数的等待操作。 在将所有对象的状态设置为已发信号之前,该函数不会修改指定对象的状态。例如,可以发信号通知互斥锁,但线程无法获得所有权< / strong>直到其他对象的状态也设置为发信号。与此同时,其他一些线程可能会获得互斥锁的所有权,从而将其状态设置为无信号。
文档是否有误,或者这是我的错误?
为什么WaitForMultipleObjectsEx
在执行APC期间获取互斥锁,即使知道它也永远不会获取互斥锁(因为执行APC意味着它将返回{{1}永远不会获取互斥锁?)
答案 0 :(得分:0)
我无法评论所以我使用答案......
你没有显示任何代码,但APC不应该在正在运行的线程中使用WAIT_IO_COMPLETION代码触发WaitForMultipleObjectsEx返回吗?