/* 题目:主线程创建两个辅助线程,辅助线程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, ¶mq, 0, NULL); //创建线程,传入参数
//sorth
param paramh;
paramh.array=array;
paramh.start=mid+1; //[
paramh.end=n-1; //]
sorth=CreateThread(NULL, 0, ThreadProc, ¶mh, 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的利用率,程序的运行效率会提高。
- 这里我们通过编写统一的回调函数,可以处理不同情况下的需求,简化了编程模式。
如果程序只完成一项任务,那样我们只要写一个单线程的程序,并且按照这个任务的执行步骤编写代码就可以了。但是当程序需要完成多项任务时,如果使用单线程的话,那就得在程序中判断每项任务是否应该执行以及在什么时候执行。如果使用多线程的话,让每一个线程处理一个单独的任务,可以只针对这个单独的任务进行编程,这样有利于开发人员对程序的理解。就是把一个大的东西分成一个一个的小东西进行处理。 - 同时,采用多线程技术,也简化了异步事件的处理。在这里,我们对数组前后分别进行选择排序,这两个操作之间是互相没有关系的,进而他们中的更细微的操作的执行先后顺序是无关的。
参考链接:
https://www.runoob.com/w3cnote/cpp-multithread-demo.html
https://blog.csdn.net/XiaoKangboy/article/details/77969758
https://www.cnblogs.com/ay-a/p/8763274.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38492.html