这里先来进行线程的入门,没有涉及到任何同步的问题,关于同步的问题后面再说。
主要函数:
_beginthreadex (注意一般不要用 CreateThread,以为这个函数在调用c库函数的时候不是线程安全的,具体细节我也不明白,不过微软都这样建议 那么就这样了,以后我不会用到CreateThread)
_endthreadex
细节不说,可以自己看msdn上的参数说明,基本上就是,给线程提供一个入口地址,提供一些参数,然后得到线程id和线程句柄。
来看个实例,下面这段代码 完成了 归并排序,只不过我们一般的归并是通过单线程的,我这里用到了2个线程,分别对一个数组的前后2部分进行排序,然后在主线程里面把这2部分合并:
#ifndef _MT
#define _MT
#endif
#include<windows.h>
#include<time.h>
#include<process.h>
#include<iostream>
using namespace std;
unsigned int _stdcall threadProc(LPVOID lpParam);
void merge(int*pFirst,int*pLast);
void merge(int *pFirst,int* pMiddle,int* pLast);
typedef struct
{
void* pFirst;//待排序数组的头指针
void* pLast;//待排序数组的末指针
}SortNum;
int main()
{
srand((int)time(0));
int iArray[100];
for(int i=0;i!=100;++i)//随机产生个待排序的数
{
iArray[i]=rand()%100;
cout<<iArray[i]<<"/t";
}
cout<<endl;
HANDLE hThread[2];
SortNum sortNum[2];
sortNum[0].pFirst=iArray;
sortNum[0].pLast=iArray+50;
sortNum[1].pFirst=iArray+50;
sortNum[1].pLast=iArray+100;
for(int i=0;i!=2;++i)//产生个线程用于分别对0~50和50~100位置的数据进行排序,最后一位不掺入排序
{
hThread[i]=(HANDLE)_beginthreadex(NULL,0,&threadProc,&sortNum[i],0,NULL);
if(hThread[i]==NULL||hThread[i]==INVALID_HANDLE_VALUE)
{
cout<<"you failed to create a thread"<<endl;
return 1;
}
}
if(WAIT_OBJECT_0!=WaitForMultipleObjects(1,hThread,TRUE,INFINITE))
{
cout<<"There must be a thread broken down"<<endl;
return 1;
}
merge((int*)iArray,(int*)iArray+50,(int*)iArray+100);
for(int i=0;i!=100;++i)
{
cout<<iArray[i]<<"/t";
}
cout<<endl;
system("pause");
return 0;
}
unsigned int _stdcall threadProc(LPVOID lpParam)
{
void* pFirst=((SortNum*)lpParam)->pFirst;
void* pLast=((SortNum*)lpParam)->pLast;
merge((int*)pFirst,(int*)pLast);
return 0;
}
void merge(int *pFirst,int*pLast)
{
if(pFirst>=pLast)
return ;
if(pFirst==pLast-1)
return ;
else
{
int *pMiddle=pFirst+(pLast-pFirst)/2;
merge(pFirst,pMiddle);
merge(pMiddle,pLast);
merge(pFirst,pMiddle,pLast);
}
}
void merge(int *pFirst,int* pMiddle,int* pLast)
{
int *pTemp=(int*)calloc(pLast-pFirst,sizeof(int));
int *_pFirst=(int*)pFirst;
int*_pMiddle=(int*)pMiddle;
int iPos=0;
for(;_pFirst!=pMiddle&&_pMiddle!=pLast;)
{
if(*_pFirst<=*_pMiddle)
{
pTemp[iPos++]=*_pFirst;
++_pFirst;
}
else
{
pTemp[iPos++]=*_pMiddle;
++_pMiddle;
}
}
if(_pFirst==pMiddle)
{
while(_pMiddle!=pLast)
pTemp[iPos++]=*(_pMiddle++);
}
else
{
while(_pFirst!=pMiddle)
pTemp[iPos++]=*(_pFirst++);
}
for(int i=0;i!=iPos;++i)
*(pFirst+i)=pTemp[i];
free(pTemp);
pTemp=0;
return ;
}
上面这段代码:
首先是随机产品100个int型数字,放到iArray数组里面。
然后创建2个线程分别对0~50和50~100位置的数据进行排序,最后一位不掺入排序
最后把2部分合并 就得到有序的数列。