迅雷多线程

第四题(迅雷笔试题):编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。


java实现见:http://blog.csdn.net/qingfengliuquan/article/details/5891187


这里我用c++基于事件对象来实现:

首先新建一空的win32 console application,然后添加一cpp文件,取名为MultiThread.cpp,下面给出其代码:

#include <windows.h>
#include <iostream>

using namespace std;

const int THREAD_NUM = 3;	//线程个数  

HANDLE g_hThreadEvent[THREAD_NUM];  //互斥事件  

int LOOP = 30;		//循环次数 

DWORD WINAPI fun1(LPVOID lpParam);
DWORD WINAPI fun2(LPVOID lpParam);
DWORD WINAPI fun3(LPVOID lpParam);

void main()
{
	int i = 0;
	HANDLE hdl[THREAD_NUM];	//线程句柄

	//事件开启的时候是没有触发的  
	for (int i = 0; i < THREAD_NUM; i++)   
		g_hThreadEvent[i] = CreateEvent(NULL,FALSE,FALSE,NULL);  
	
	//线程句柄
	hdl[0] = ::CreateThread(NULL, 0, fun1, NULL, 0, NULL); 
	hdl[1] = ::CreateThread(NULL, 0, fun2, NULL, 0, NULL); 
	hdl[2] = ::CreateThread(NULL, 0, fun3, NULL, 0, NULL); 
  
    //触发第一个线程,线程函数会按顺序自己触发下一个要执行的线程  
    SetEvent(g_hThreadEvent[0]);  
  
    WaitForMultipleObjects(THREAD_NUM , hdl, TRUE, INFINITE);  
  
    //清理  
    for (i = 0; i < THREAD_NUM; i++)  
    {  
        CloseHandle(hdl[i]);  
        CloseHandle(g_hThreadEvent[i]);  
    }  

	getchar();
}

DWORD WINAPI fun1(LPVOID lpParam)
{
	while(true)
	{
		WaitForSingleObject(g_hThreadEvent[0],INFINITE); 
		if(LOOP > 0)
		{
			
			cout<<"A";
			LOOP--;
			SetEvent(g_hThreadEvent[1]);
		}
		else
		{
			break;
		}
	}
	return 0;
}

DWORD WINAPI fun2(LPVOID lpParam)
{
	while(true)
	{
		WaitForSingleObject(g_hThreadEvent[1],INFINITE); 
		if(LOOP > 0)
		{
			cout<<"B";
			LOOP--;
			SetEvent(g_hThreadEvent[2]);
		}
		else
		{
			break;
		}
	}
	
	return 0;
}

DWORD WINAPI fun3(LPVOID lpParam)
{
	while(true)
	{
		WaitForSingleObject(g_hThreadEvent[2],INFINITE); 
		if(LOOP > 0)
		{
			cout<<"C";
			LOOP--;
			SetEvent(g_hThreadEvent[0]);
		}
		else
		{
			break;
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值