#include <stdio.h>
#include <windows.h>
HANDLE hEvents[2];
DWORD i;
//void wait(DWORD dwEvent);
void wait(char* s);
DWORD WINAPI ThreadProc1( LPVOID lpParam ) {
//DWORD dwEvent;
//wait(dwEvent);
wait("ThreadProc1");
::SetEvent(hEvents[1]);
::SetEvent(hEvents[0]);
return 0;
}
DWORD WINAPI ThreadProc2( LPVOID lpParam ) {
//DWORD dwEvent;
//wait(dwEvent);
wait("ThreadProc2");
return 0;
}
DWORD WINAPI ThreadProc( LPVOID lpParam ) {
::SetEvent(hEvents[1]);
::SetEvent(hEvents[0]);
return 0;
}
int main(int argc, char* argv[])
{
// Create two event objects.
for (i = 0; i < 2; i++)
{
hEvents[i] = CreateEvent(
NULL, // default security attributes
FALSE, // auto-reset event object
FALSE, // initial state is nonsignaled
NULL); // unnamed object
if (hEvents[i] == NULL)
{
printf("CreateEvent error: %d/n", GetLastError() );
ExitProcess(0);
}
}
// The creating thread waits for other threads or processes
// to signal the event objects.
CreateThread(
NULL, // default security attributes
0, // use default stack size
ThreadProc1, // thread function
NULL, // argument to thread function
0, // use default creation flags
NULL); // returns the thread identifier
CreateThread(
NULL, // default security attributes
0, // use default stack size
ThreadProc2, // thread function
NULL, // argument to thread function
0, // use default creation flags
NULL); // returns the thread identifier
CreateThread(
NULL, // default security attributes
0, // use default stack size
ThreadProc, // thread function
NULL, // argument to thread function
0, // use default creation flags
NULL); // returns the thread identifier
getchar();
}
void wait(char* s){
DWORD dwEvent;
dwEvent = WaitForMultipleObjects(
2, // number of objects in array
hEvents, // array of objects
TRUE, // wait for any
INFINITE); // indefinite wait
// Return value indicates which event is signaled.
switch (dwEvent)
{
// hEvent[0] was signaled.
case WAIT_OBJECT_0 + 0:
printf("0 %s",s);
// Perform tasks required by this event.
break;
// hEvent[1] was signaled.
case WAIT_OBJECT_0 + 1:
// Perform tasks required by this event.
printf("1 %s", s);
break;
// Return value is invalid.
default:
printf("Wait error: %d/n", GetLastError());
ExitProcess(0);
}
}
07-24
07-24