none
多线程 WaitForMultipleObject 优先级的问题 RRS feed

  • 问题

  • 哪位知道,一个线程等待多个object 是不是有优先级高低的问题。举个例子如下:

    ============ BEGIN CODE  =========================

    HANDLE handlesToWaitFor[3];
    handlesToWaitFor[0] = evtA;
    handlesToWaitFor[1] = evtB;
    handlesToWaitFor[2] = evtC;

    while (!Kill)
    {
       dwHandleSignaled = WaitForMultipleObjects(15,handlesToWaitFor,FALSE,INFINITE);

        switch(dwHandleSignaled)
        {
           case WAIT_OBJECT_0: ...  // evtA comes
           case WAIT_OBJECT_0 + 1: ...  // evtB comes
           case WAIT_OBJECT_0 + 2:...  // evtC comes
        }
    }

    ============= END CODE =======================

    问题是,如果evtA和evtB同时有很多,这样线程会先把所有的 evtA执行完,然后

    再去执行evtB,因为evtA 在evtB前面(这是我观察的结论,虽然是case语法,但仍然有

    优先级别)

    Questions :

    (1) 请问有人遇到这情况吗?是不是确实有evt优先级问题

    (2)如果要改成所有evt平等没有优先级,改怎么做?

     

    thanks

     

    2010年11月17日 1:44

答案

全部回复

  • 怎么保证EvtA和EvtB同时被激活?我觉得问题是你的激活线程的优先级。


    麻烦把正确答案设为解答。
    2010年11月17日 2:19
    版主
  • windows是一个抢占式的操作系统

    即便是优先级高的线程也未必会先被执行

    只是说它被执行的可能性大

    至于WaitForMultipleObjects就更没有所谓优先级的问题了

    既然bWaitAll设为false了那谁执行完了就先返回谁

    所以关键是你等待的对象的执行问题

    2010年11月17日 3:08
  • 我说的不太确切,不可能同时间被激活。

    我的意思是,EVTA和EVTB都很多event,2个case都很忙,

    那么这个thread就会去做完 EvtA,然后再去 EVTB,

    而不是roundrobin

     

    2010年11月17日 17:40
  • 嗯如果WaitForMultipleObject等待的事件同时到达确实只返回索引比较小的

    你看看这里的介绍会不会对你有帮助

    http://baike.baidu.com/view/1225409.htm

    • 已标记为答案 鬼_ 2010年11月19日 7:10
    2010年11月18日 0:51
  • When bWaitAll is FALSE, this function checks the handles in the array in order starting with index 0, until one of the objects is signaled. If multiple objects become signaled, the function returns the index of the first handle in the array whose object was signaled.

    以上是MSDN的描述。那么被激活则返回第一个index的事件。所以每次都是前面的Evta被触发。


    麻烦把正确答案设为解答。
    2010年11月18日 7:04
    版主