枚举排序各种并行之Win32API

利用CreateEvent创建事件,CreateThread创建线程


// 1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <Windows.h>
#include "time.h"
#include <iostream>
using namespace std;

HANDLE HX_finish[2];
HANDLE HX_finish2;
int HX_DataSize;              /*HX_DataSize:数组长度;*/  
int *HX_data_in, *HX_data_out;             /*输入和输出数组指针*/
DWORD WINAPI ThreadOne(LPVOID param)//线程1
{
	for(int HX_i=0;HX_i<HX_DataSize;HX_i+=2)
	{
		int HX_k1=0;
		for (int HX_j=0;HX_j<HX_DataSize;HX_j++)
			{
				if (HX_data_in[HX_i]>HX_data_in[HX_j])
				{
					HX_k1++;//记录比自己小的数的个数
				}
			}
			HX_data_out[HX_k1]=HX_data_in[HX_i];
	}
	SetEvent(HX_finish[0]);
	return 0;
}
DWORD WINAPI ThreadTwo(LPVOID param)//线程2
{
	for(int HX_i=1;HX_i<HX_DataSize;HX_i+=2)
	{
		int HX_k2=0;
		for (int HX_j=0;HX_j<HX_DataSize;HX_j++)
			{
				if (HX_data_in[HX_i]>HX_data_in[HX_j])
				{
					HX_k2++;//记录比自己小的数的个数
				}
			}
			HX_data_out[HX_k2]=HX_data_in[HX_i];
	}
	SetEvent(HX_finish[1]);
	return 0;
}
DWORD WINAPI ThreadThree(LPVOID param)//主线程做的任务
{
	for(int HX_i=0;HX_i<HX_DataSize;HX_i++)
	{
		int HX_k=0;
		for (int HX_j=0;HX_j<HX_DataSize;HX_j++)
			{
				if (HX_data_in[HX_i]>HX_data_in[HX_j])
				{
					HX_k++;//记录比自己小的数的个数
				}
			}
			HX_data_out[HX_k]=HX_data_in[HX_i];
	}
	cout<<"串行"<<endl;
	/*for(int HX_i=0;HX_i<HX_DataSize;HX_i++)
	{
    	 cout<<HX_data_out[HX_i]<<" ";
     }*/
	cout<<endl;
	SetEvent(HX_finish2);
	return 0;
}
/* 
* 函数名: GetDataSize 
* 功能: 读入待排序序列的长度 
* 输入: 待排序序列的长度 
* 输出: 返回待排序序列的长度 
*/ 
int GetDataSize()  
{  
	int HX_i;  

	while(1){  
		printf("请输入数组的大小 :");  
		scanf("%d",&HX_i);  
		if(HX_i>0)  
			break;  
		cout<<"Wrong Data Size."<<endl;  
	}  
	return HX_i;  
}
int _tmain(int argc, _TCHAR* argv[])
{
	int HX_i,HX_j;
	clock_t HX_t1,HX_t2;
	  

	HX_DataSize=GetDataSize();   /*HX_DataSize:数组长度;*/
	HX_data_in=(int *)malloc(HX_DataSize*sizeof(int)); /*分配待排序序列的空间*/
	if(HX_data_in==0) cout<<"Malloc memory error!"<<endl;
	HX_data_out=(int *)malloc(HX_DataSize*sizeof(int)); /*分配排序后数组的空间*/  
	if(HX_data_out==0) cout<<"Malloc memory error!"<<endl;

	//获得随机数
	int HX_seed;  
	printf("请输入随机数的种子:");  
	scanf("%d",&HX_seed);   /*获得随机数的种子*/  
	srand(HX_seed);           /*srand初始化随机种子*/                 
	printf("获得随机数\n");   
	for(HX_i=0;HX_i<HX_DataSize;HX_i++)
	{  
		HX_data_in[HX_i]=((int)rand())%100000;  //*生成随机数,并输出
		//cout<<HX_data_in[HX_i]<<" ";  
	}
	cout<<endl;

	//并行----------------
	HX_t1=clock();
	long long sumpara=0;
	HX_finish[0]=CreateEvent(NULL,false,false,NULL);//创建事件
	HX_finish[1]=CreateEvent(NULL,false,false,NULL);
	
	HANDLE thread1=CreateThread(NULL,0,ThreadOne,NULL,0,NULL);//创建线程
	HANDLE thread2=CreateThread(NULL,0,ThreadTwo,NULL,0,NULL);
	WaitForMultipleObjects(2,HX_finish,true,INFINITE);//等待两个线程都完成
	cout<<"并行"<<endl;
	/*for(HX_i=0;HX_i<HX_DataSize;HX_i++)
	{
    	 cout<<HX_data_out[HX_i]<<" ";
     }*/
	cout<<endl;
	HX_t2=clock();
	printf("并行时间=%d\n",HX_t2-HX_t1);

	//串行----------------
	HX_t1=clock();
	HX_finish2=CreateEvent(NULL,false,false,NULL);
	HANDLE thread3=CreateThread(NULL,0,ThreadThree,NULL,0,NULL);
	WaitForSingleObject(HX_finish2,INFINITE);
	HX_t2=clock();
	printf("串行时间=%d\n",HX_t2-HX_t1);
	system("pause");
	return 0;
}

测试正确性:

枚举排序各种并行之Win32API_第1张图片

测试加速比:

枚举排序各种并行之Win32API_第2张图片

你可能感兴趣的:(枚举排序各种并行之Win32API)