为什么WaitForMultipleObjectsEx在APC期间获取互斥?

时间:2013-05-08 20:38:10

标签: winapi visual-c++ mutex apc waitformultipleobjects

我有5个线程(在多核系统上)同时等待:

  1. 要获得的互斥锁M
  2. 要发信号的事件E
  3. 我使用WaitForMultipleObjectsEx(..., TRUE, INFINITE, TRUE)因为线程使用了APC 请注意,APC 以任何方式使用/ touch / alter /观察互斥锁或事件。

    我使用Visual Studio和Process Hacker进行调试,我目睹了一种奇怪的现象:
    通常,假定运行的线程(称之为线程A)仍然在等待这两个对象。

    我说"应该跑#34;这是因为:

    1. 我已多次验证(包括通过Process Hacker)E确实处于信号状态
    2. 没有其他线程获得M的所有权。事实上, 3 其他线程等待获取M.
    3. 然而,根据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

        

      bWaitAllTRUE时,仅当所有对象的状态都已设置为已发信号时,才会完成函数的等待操作。 在将所有对象的状态设置为已发信号之前,该函数不会修改指定对象的状态。例如,可以发信号通知互斥锁,但线程无法获得所有权< / strong>直到其他对象的状态也设置为发信号。与此同时,其他一些线程可能会获得互斥锁的所有权,从而将其状态设置为无信号。

      文档是否有误,或者这是我的错误?

      为什么WaitForMultipleObjectsEx在执行APC期间获取互斥锁,即使知道它也永远不会获取互斥锁(因为执行APC意味着它将返回{{1}永远不会获取互斥锁?)

1 个答案:

答案 0 :(得分:0)

我无法评论所以我使用答案......

你没有显示任何代码,但APC不应该在正在运行的线程中使用WAIT_IO_COMPLETION代码触发WaitForMultipleObjectsEx返回吗?