两个线程交替执行

关于多线程编程请参考http://blog.csdn.net/morewindows/article/details/17488865 第二部分

本文实现两个线程的交替执行,一个线程输出奇数,另一个输出偶数,一定要是交替执行。

这里使用的是事件event和临界区criticalsection来实现,其中event用于主线程和子线程之间的同步,而criticalsection用于子线程之间的互斥。

代码如下,其中代码中间有详细的注释。


#include
#include
#include
using namespace std;

int g_t=0;
HANDLE g_hThreadEvent1;
CRITICAL_SECTION g_csThreadCode1;
HANDLE event0;
HANDLE event1;
bool flag0 = false;
bool flag1 = true;

unsigned int __stdcall Fun2(void* pPM)
{
	int nThreadID=*(int *)pPM;
	SetEvent(g_hThreadEvent1);
	Sleep(50);
	
	for(int i=0;i<20;++i)
	{	
		if(nThreadID==0)
		{
			//Sleep(50);
			SetEvent(event1);//激活另外一个线程	
			WaitForSingleObject(event0,INFINITE);
			while(!flag0)
				Sleep(1);
		}
		else
		{
			//Sleep(50);
			SetEvent(event0);
			WaitForSingleObject(event1,INFINITE);
			while(!flag1)
				Sleep(1);
		}
		//临界区保证子线程对全局变量的互斥访问
		EnterCriticalSection(&g_csThreadCode1);
		if(nThreadID==0)
		{
			//阻塞当前线程 
			//ResetEvent(event0);//不能加ResetEvent,否则会在某一时刻线程0调用ResetEvent而线程1调用SetEvent,会出错
			flag0 = false;
			flag1 = true;
		}
		else
		{
			//ResetEvent(event1);
			flag0 = true;
			flag1 = false;
		}
		cout<<"ID:"<


在main函数中调用alternateExe2()即可实现。


本来最开始不想用标识量来实现的,但是发现在当前线程内设置其为未触发,即在

if(nThreadID==0)
{}
内ResetEvent(event0);会导致会在某一时刻线程0调用ResetEvent而线程1调用SetEvent,这样cpu就能调度两个线程了,因而出错。最后还是通过设置标志量,让其中一个线程一直等待即可。


结果如下:


两个线程交替执行_第1张图片

你可能感兴趣的:(多线程编程)