您的当前位置:首页正文

Windows C++ 多线程编程示例

2024-11-27 来源:个人技术集锦
/*
题目:主线程创建两个辅助线程,辅助线程1使用选择排序算法对数组的前半部分排序,
     辅助线程2使用选择排序算法对数组的后半部分排序,
     主线程等待辅助线程运行結束后,使用归并排序算法归并子线程的计算结果
开发工具:DEV windows平台
语言:C++
*/
#include <windows.h>
#include <iostream>
using namespace std; 

#define MAX 100   //数组空间最大值

int array[MAX];   //待排序的数组

typedef struct param{    //作为线程参数传入的结构体
    int *array;
    int start,end;
}param;

void swap(int *a,int *b)   //选择排序中用到的交换函数
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

DWORD WINAPI ThreadProc(LPVOID lpParameter)   //线程的回调函数
{   //进行选择排序
    param *p;
    p=(param *)lpParameter;  //将线程参数强制转化为所需类型
    int l=p->start,r=p->end;
    if(l>=r) return NULL;
    
    for (int i = l ; i < r; i++)
    {
        int min = i;
        for (int j = i + 1; j <= r; j++)     
            if (p->array[j] < p->array[min])    
                min = j;    
        swap(&p->array[min], &p->array[i]);   
    }
    return 0L;
}

int main()
{   
    int n;
    //处理输入、初始化
    cout<<"please enter the length of the array:";
    cin>>n;
    cout<<"please enter the element of the array:";
    for(int i=0;i<n;i++) cin>>array[i];
    
    HANDLE sortq,sorth;
    
    int mid=(0+n-1)>>1;
    //sortq
    param paramq;
    paramq.array=array;
    paramq.start=0;             //[
    paramq.end=mid;             //]
    sortq=CreateThread(NULL, 0, ThreadProc, &paramq, 0, NULL);   //创建线程,传入参数
    
    //sorth
    param paramh;
    paramh.array=array;
    paramh.start=mid+1;         //[
    paramh.end=n-1;             //]
    sorth=CreateThread(NULL, 0, ThreadProc, &paramh, 0, NULL);   //创建线程,传入参数
    
    WaitForSingleObject(sortq,INFINITE);   //等待线程执行结束返回主线程
    WaitForSingleObject(sorth,INFINITE);   //等待线程执行结束返回主线程
    
    //主线程进行归并排序 
    int k=0,i=0,j=mid+1;
    int temp[MAX];
    while(i<=mid&&j<=n-1)
    {
        if(array[i]<array[j]) temp[k++]=array[i++];
        else temp[k++]=array[j++];
    }
    while(i<=mid) temp[k++]=array[i++];
    while(j<=n-1) temp[k++]=array[j++];
    
    for(int i=0,j=0;j<=n-1;j++,i++) array[j]=temp[i];
    
    for(int i=0;i<n;i++) printf("%d ",array[i]);
    printf("\n");
    return 0;
}

多线程实现的方法:

  • 在进程中调用线程创建函数CreateThread( ),传入必要的参数,即可创建一个新的线程执行。
  • 在创建进程后,进入线程并行执行,这里使用了WaitForSingleObject(,INFINITE)函数,意在等待创建的线程执行完了再回到主线程,而不是主线程和子线程并行执行

此示例所体现的多进程技术的特点:

  • 原本需要对一个数组进行整体的选择排序,这里我们分为两个部分,创建两个线程来并行执行,提高了CPU的利用率,程序的运行效率会提高
  • 这里我们通过编写统一的回调函数,可以处理不同情况下的需求,简化了编程模式
    如果程序只完成一项任务,那样我们只要写一个单线程的程序,并且按照这个任务的执行步骤编写代码就可以了。但是当程序需要完成多项任务时,如果使用单线程的话,那就得在程序中判断每项任务是否应该执行以及在什么时候执行。如果使用多线程的话,让每一个线程处理一个单独的任务,可以只针对这个单独的任务进行编程,这样有利于开发人员对程序的理解。就是把一个大的东西分成一个一个的小东西进行处理。
  • 同时,采用多线程技术,也简化了异步事件的处理。在这里,我们对数组前后分别进行选择排序,这两个操作之间是互相没有关系的,进而他们中的更细微的操作的执行先后顺序是无关的。

参考链接:


显示全文