三個執行緒交替執行,c++實現
阿新 • • 發佈:2019-02-17
程式碼如下:
在main函式中呼叫alternateExe3()即可實現。#pragma once #include<Windows.h> #include<process.h> #include<iostream> using namespace std; int g_t=0; HANDLE g_hThreadEvent1; CRITICAL_SECTION g_csThreadCode1; HANDLE event0; HANDLE event1; HANDLE event2; bool flag0 = false; bool flag1 = true; bool flag2 = false; unsigned int __stdcall Fun3(void* pPM) { int nThreadID=*(int *)pPM; SetEvent(g_hThreadEvent1); Sleep(50); for(int i=0;i<10;++i) { if(nThreadID==0) { SetEvent(event1);//啟用另外一個執行緒 WaitForSingleObject(event0,INFINITE); while(!flag0) Sleep(1); EnterCriticalSection(&g_csThreadCode1); //ResetEvent(event0); cout<<"C"; flag0 = false; flag1 = true; LeaveCriticalSection(&g_csThreadCode1); Sleep(50);//一定要阻塞當前執行緒一定時間,不然在某一個會死鎖。保證其他執行緒能執行。 } else if(nThreadID==1) { SetEvent(event2); WaitForSingleObject(event1,INFINITE); while(!flag1) Sleep(1); EnterCriticalSection(&g_csThreadCode1); //ResetEvent(event1); cout<<"A"; flag1 = false; flag2 = true; LeaveCriticalSection(&g_csThreadCode1); Sleep(50); } else if(nThreadID==2) { SetEvent(event0); WaitForSingleObject(event2,INFINITE); while(!flag2) Sleep(1); EnterCriticalSection(&g_csThreadCode1); //ResetEvent(event2); cout<<"B"; flag2 = false; flag0 = true; LeaveCriticalSection(&g_csThreadCode1); Sleep(50); } } return 0; } //三個程序交替進行列印 void alternateExe3() { const int num = 3; HANDLE handle[num]; g_hThreadEvent1 = CreateEvent(NULL,false,false,NULL); event0 = CreateEvent(NULL,false,false,NULL); event1 = CreateEvent(NULL,false,false,NULL); event2 = CreateEvent(NULL,false,false,NULL); InitializeCriticalSection(&g_csThreadCode1); int i=0; while(i<num) { handle[i]=(HANDLE)_beginthreadex(NULL,0,Fun3,&i,0,NULL); WaitForSingleObject(g_hThreadEvent1,INFINITE); i++; } WaitForMultipleObjects(num,handle,TRUE,INFINITE); CloseHandle(g_hThreadEvent1); CloseHandle(event0); CloseHandle(event1); CloseHandle(event2); DeleteCriticalSection(&g_csThreadCode1); }
實現原理與兩個執行緒一致,都是通過設定標識量來完成,而且在當前執行緒中觸發下一執行緒。
結果為