问题:
编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
解答:
在这里我们将题简化为循环打印5遍
HANDLE g_eventA; HANDLE g_eventB; HANDLE g_eventC; unsigned int __stdcall threadFuncA(LPVOID param) { int id = GetCurrentThreadId(); for (int i = 0; i<5; ++i) { WaitForSingleObject(g_eventA,INFINITE); cout <<"线程ID="<<id<<endl; SetEvent(g_eventB); Sleep(200); } return 0; } unsigned int __stdcall threadFuncB(LPVOID param) { int id = GetCurrentThreadId(); for (int i = 0; i<5; ++i) { WaitForSingleObject(g_eventB,INFINITE); cout <<"线程ID="<<id<<endl; SetEvent(g_eventC); Sleep(200); } return 0; } unsigned int __stdcall threadFuncC(LPVOID param) { int id = GetCurrentThreadId(); for (int i = 0; i<5; ++i) { WaitForSingleObject(g_eventC,INFINITE); cout <<"线程ID="<<id<<endl; SetEvent(g_eventA); Sleep(200); } return 0; } int main(int argc, char **argv) { g_eventA = CreateEvent(NULL,false,true,NULL); g_eventB = CreateEvent(NULL,false,false,NULL); g_eventC = CreateEvent(NULL,false,false,NULL); HANDLE hdl[3]; hdl[0] =(HANDLE)_beginthreadex(NULL,0,threadFuncA,NULL,0,NULL); hdl[1] =(HANDLE)_beginthreadex(NULL,0,threadFuncB,NULL,0,NULL); hdl[2] =(HANDLE)_beginthreadex(NULL,0,threadFuncC,NULL,0,NULL); WaitForMultipleObjects(3,hdl,true,INFINITE); for (int i =0; i<3; ++i) { CloseHandle(hdl[i]); } CloseHandle(g_eventA); CloseHandle(g_eventB); CloseHandle(g_eventC); return 0; }