如我我使用
WaitForMultipleObjects
函数 
里面的事件都是semaphor的事件,例如 
sema[0], sema[1], sema[2]三个事件 
那么WaitForMultipleObjects(3, sema, false, infinity)触发的时候,sema[i]是怎么变化的? 
例如只有sema[0]有信号,那么sema[1]和sema[2]变化吗? 
或者三个都有信号,那么wait之后三个信号量都减1么?谢谢

解决方案 »

  1.   

    WaitForMultipleObjects(3, sema, false, infinity)由于sema[0]有信号而返回,应该不会影响到sema[1],sema[2]的。因为你第三个参数是false,表示只要有一个对象有信号函数就会返回。
      

  2.   

    bWaitAll 
    If this parameter is TRUE, the function returns when the state of all objects in the lpHandles array is signaled. If FALSE, the function returns when the state of any one of the objects is set to signaled. In the latter case, the return value indicates the object whose state caused the function to return.
      

  3.   

    WaitForMultipleObjects(3, sema, false, infinity);
    1.这个函数中第三参数为false,表示只要一个信号量变成有信号的,这个函数就会返回,返回值WAIT_OBJECT_0+n,其中n代表数组中第n+1个成员变成有信号的。
    2.对于信号量而言,一旦它变成有信号的,然后WaitFor函数又返回了,那么,信号量的信号数就会减一,在信号量上调用ReleaseSemaphore时,信号量的信号数就会加一。
    3.对于信号量而言,当的信号数大于0的时候,它就是有信号态的。WaitForMultipleObjects只是返回数组中第一个变成信号态的同步对象,也有这种可能,就是说数组后面有第二个成员变成信号态,这时,你需要循环调用WaitForMulitpleObjects,取出第一个变成信号态的信号量,然后将这个信号对象句柄从数组中删除,使用LocalAlloc动态分配句柄数组。然后再次调用WaitForMulitpleObjects取出下一个变成信号态的信号量,直到WaitForMulitpleObjects返回WAIT_TIMEOUT。