




























UINT ThreadProc3(LPVOID pParam)
{
WaitForSingleObject(hEvent[0],INFINITE);
for (int i = 0; i < 10; i++)
{
g_cArray[i] = 'a';
Sleep(1);
}
TRACE("Second T3");
SetEvent(hEvent[0]);
SetEvent(hEvent[2] );
return 0;
}
UINT ThreadProc4(LPVOID pParam)
{
WaitForSingleObject(hEvent[1],INFINITE);
for (int i = 0; i < 10; i++)
{
g_cArray[10-i-1] = 'b';
Sleep(1);
}
TRACE("First ---T4");
SetEvent(hEvent[1]);
SetEvent(hEvent[0]);
return 0;
}
UINT ThreadProc5(LPVOID pParam)
{
WaitForSingleObject(hEvent[2],INFINITE);
for (int i = 0; i < 10; i++)
{
g_cArray[10-i-1] = 'c';
Sleep(1);
}
TRACE("Third T5");
SetEvent(hEvent[2]);
SetEvent(hEvent[3]);
return 0;
}
//Testing
void CTestCritionDlg::OnButton2()
{
hEvent[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
hEvent[1] = CreateEvent(NULL, FALSE, FALSE, NULL);
hEvent[2] = CreateEvent(NULL, FALSE, FALSE, NULL);
SetEvent(hEvent[1]);
AfxBeginThread(ThreadProc4, NULL);
AfxBeginThread(ThreadProc3, NULL);
AfxBeginThread(ThreadProc5, NULL);
DWORD dwRet2 = WaitForMultipleObjects(4, hEvent, TRUE, INFINITE);
if (dwRet2 == WAIT_OBJECT_0)
{
CString sResult = CString(g_cArray);
AfxMessageBox(sResult);
}
}
解释:
开出三个线程,控制线程按次序等待进行调度,从这个例子中可以理解生产者和消费者问题。
程序一旦进入运行,必然按这个次序进行调度,但如果调用AfxMessageBox,因为这个是系统开销,弹出的对话框
次序不一定一致,这点需要注意。
解决办法:可以采用延时机制每个线程中SetEvent前加上延时。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。