SetEvent is called without a ResetEvent

what happens if the manual-reset event is set using setEvent but not reset using ResetEvent; and this event is fired several times .ie while the event is being processed, the event is set again.

The following example task:

void foo()
{
...
   SetEvent(hEvent1);
...
}
void foo1()
{
...
SetEvent(hEvent2);
...
}
int MainHandler()
{
...
 dwEvent = WaitForMultipleObjects(2,
 ghEvents,     // array of objects
 FALSE,       // wait for any object
 5000); 
switch(dwEvent)
{
case hEvent1:
//do something
break;
case hEvent2:
//do something
break;
}
}

Now suppose that when the case of hEvent1 is executed (i.e. it is still installed), somehow hEvent1 starts again. I intentionally did not set ResetEvent (hEvent1), although this event is manually reset. So, do we have a race condition?

+2
source share
2 answers

WaitForMultipleObjects , . , , WaitForMultipleObjects . .

WaitForMultipleObjects , , .

, , ( reset) , (.. ).

, , hEvent1 , hEvent2 .

, , ​​ , - . - . :

UINT CMyClass::ThreadFunc()
{
    // make an array of some interesting event handles
    HANDLE hEvents[2] = { m_hKillEvent, m_hWorkEvent };

    // main loop - do work until killed
    while (true)
    {
        // wait for either event
        DWORD dwRet = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE);

        // see why we got signalled
        if (dwRet == WAIT_OBJECT_0)
        {
            // kill requested - exit loop
            break;
        }
        else if (dwRet == WAIT_OBJECT_0 + 1)
        {
            // work requested - do some work here
        }
        else
        {
            // error handling - bad handles?
        }
    }

    // normal exit
    return 0;
}

, - SetEvent(m_hWorkEvent), , , SetEvent(m_hKillEvent), . - , , - :

// close worker thread
SetEvent(m_hKillEvent);

// wait for thread to die peacefully
DWORD dwRet = WaitForSingleObject(m_hWorkerThread, 5000);
if (dwRet == WAIT_TIMEOUT)
{
    // worker failed to respond - error handling here
}

, m_hWorkEvent - , do some work here . , WaitForMultipleObjects kill , .

, :

    // make an array of some interesting event handles
    HANDLE hEvents[2] = { m_hWorkEvent, m_hKillEvent };

m_hWorkEvent (, do some work here, reset, reset ), . .

. kill ( ), . , , .

, , , WaitForMultipleObjects "" , , - , :

if (WaitForSingleObject(hSomeEvent, 0) == WAIT_OBJECT_0)
{
    // ... hSomeEvent was signaled
}

kill .

+1

- , true . , , , .

, ", ". , "" - , HANDLE, "-, ".

+2

All Articles