15,471
社区成员
发帖
与我相关
我的任务
分享
HANDLE g_hEventA[2];// work and quit
HANDLE g_hEventB[2];// work and quit
HANDLE g_hEventC[3];// A work done, B work done and quit
int main()
{
...;
g_hEventA[0] = ::CreateEvent(NULL, FALSE, FALSE, NULL);
g_hEventA[1] = ::CreateEvent(NULL, FALSE, FALSE, NULL);
g_hEventB[0] = ::CreateEvent(NULL, FALSE, FALSE, NULL);
g_hEventB[1] = ::CreateEvent(NULL, FALSE, FALSE, NULL);
g_hEventC[0] = ::CreateEvent(NULL, FALSE, FALSE, NULL);
g_hEventC[1] = ::CreateEvent(NULL, FALSE, FALSE, NULL);
g_hEventC[2] = ::CreateEvent(NULL, FALSE, FALSE, NULL);
Create and run thread A;
Create and run thread B;
Create and run thread C;
...;
getch();
::SetEvent(g_hEventA[1]);
::SetEvent(g_hEventB[1]);
::SetEvent(g_hEventC[2]);
Close all handles above;
return 0;
}
UINT ThreadA (...)
{
while (1)
{
switch(::WaitForMultipleObjects(2, g_hEventA, FALSE, INFINITE))
{
case WAIT_OBJECT_0:
Get data;
break;
case WAIT_OBJECT_0 + 1:
goto A_QUIT;
}
}
A_QUIT:
return 0;
}
UINT ThreadB (...)
{
while (1)
{
switch(::WaitForMultipleObjects(2, g_hEventB, FALSE, INFINITE))
{
case WAIT_OBJECT_0:
Get data;
break;
case WAIT_OBJECT_0 + 1:
goto B_QUIT;
}
}
B_QUIT:
return 0;
}
UINT ThreadC (...)
{
HANDLE hEvent[2];
hEvent[0] = g_hEventC[0];
hEvent[1] = g_hEventC[1];
::SetEvent(g_hEventA[0]);// let A work now
::SetEvent(g_hEventB[0]);// let B work now
while (1)
{
if (::WaitForSingleObject(g_hEventC[2], 100) == WAIT_OBJECT_0)
break;
switch(::WaitForMultipleObjects(2, hEvent, TRUE, 100))
{
case WAIT_OBJECT_0:
Send data;
::SetEvent(g_hEventA[0]);// let A work again
::SetEvent(g_hEventB[0]);// let B work again
break;
default:
break;
}
}
return 0;
}