线程管理_1

这里先来进行线程的入门,没有涉及到任何同步的问题,关于同步的问题后面再说。

主要函数:

_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部分合并 就得到有序的数列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值