1. 程式人生 > >三個執行緒交替執行,c++實現

三個執行緒交替執行,c++實現

程式碼如下:

#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);
}

在main函式中呼叫alternateExe3()即可實現。

實現原理與兩個執行緒一致,都是通過設定標識量來完成,而且在當前執行緒中觸發下一執行緒。

結果為