原型:DWORD WaitForMultipleObjects(

DWORD nCount,

const HANDLE* lpHandles,

BOOL bWaitAll,

DWORD dwMilliseconds

);

当WaitForMultipleObjects等到多个内核对象的时候,如果它的bWaitAll 参数设置为false。其返回值减去WAIT_OBJECT_0 就是参数lpHandles数组的序号。如果同时有多个内核对象被触发,这个函数返回的只是其中序号最小的那个。如果为TRUE 则等待所有信号量有效再往下执行。(FALSE 当有其中一个信号量有效时就向下执行)


多个内核对象被触发时,WaitForMultipleObjects选择其中序号最小的返回。而WaitForMultipleObjects它只会改变使它返回的那个内核对象的状态。

这儿又会产生一个问题,如果序号最小的那个对象频繁被触发,那么序号比它大的内核对象将得不到被处理的机会。

为了解决这一问题,可以采用双WaitForMultipleObjects检测机制来实现。见下面的例子:

DWORD WINAPI ThreadProc(LPVOID lpParameter)

{

    DWORD dwRet = 0;

    int nIndex = 0;

    while(1)

    {

        dwRet = WaitForMultipleObjects(nCount,pHandles,false,INFINITE);

        switch(dwRet)

        {

            case WAIT_TIMEOUT:

                break;

            case WAIT_FAILED:

                return 1;

            default:

            {

                nIndex = dwRet - WAIT_OBJECT_0;

                ProcessHanlde(nIndex++);

                //同时检测其他的事件

                while(nIndex < nCount) //nCount事件对象总数

                {

                    dwRet = WaitForMultipleObjects(nCount - nIndex,&pHandles[nIndex],false,0);

                    switch(dwRet)

                    {

                        case WAIT_TIMEOUT:

                            nIndex = nCount; //退出检测,因为没有被触发的对象了.

                            break;

                        case WAIT_FAILED:

                            return 1;

                        default:

                        {

                            nIndex = nIndex + dwRet - WAIT_OBJECT_0;

                            ProcessHanlde(nIndex++);

                        }

                            break

                    }

                }

            }

                break;

            }

        }

        return 0;

    }