/*
题目:主线程创建两个辅助线程,辅助线程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;//sortqparam paramq;paramq.array=array;paramq.start=0;             //[paramq.end=mid;             //]sortq=CreateThread(NULL, 0, ThreadProc, &paramq, 0, NULL);   //创建线程,传入参数//sorthparam 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的利用率,程序的运行效率会提高
  • 这里我们通过编写统一的回调函数,可以处理不同情况下的需求,简化了编程模式
    如果程序只完成一项任务,那样我们只要写一个单线程的程序,并且按照这个任务的执行步骤编写代码就可以了。但是当程序需要完成多项任务时,如果使用单线程的话,那就得在程序中判断每项任务是否应该执行以及在什么时候执行。如果使用多线程的话,让每一个线程处理一个单独的任务,可以只针对这个单独的任务进行编程,这样有利于开发人员对程序的理解。就是把一个大的东西分成一个一个的小东西进行处理。
  • 同时,采用多线程技术,也简化了异步事件的处理。在这里,我们对数组前后分别进行选择排序,这两个操作之间是互相没有关系的,进而他们中的更细微的操作的执行先后顺序是无关的。

参考链接:
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

Windows C++ 多线程编程示例相关推荐

  1. Win32 API 多线程编程示例 - 窗口版

    网上有一些Win32 多线程编程示例,多是控制台版本:下面哥作一个窗口版本: /*-------------------------------------------------bobo, 2020 ...

  2. (C#)安全、简单的Windows Forms多线程编程 (一)

    (C#)安全.简单的Windows Forms多线程编程  (一) Chris Sells June 28, 2002 翻译:袁晓辉 www.farproc.com farproc#AT#gmail# ...

  3. 多线程(十)多线程编程示例

    文章目录 一.交替输出1A2B3C4D5E... 1.1 synchronized/wait/notify 1.2 Condition/await/signal 二.生产者–消费者问题 2.1 syn ...

  4. Windows下多线程编程技术及其实现

    本文首先讨论16位Windows下不具备的线程的概念,然后着重讲述在32位Windows 95环境下多线程的编程技术,最后给出利用该技术的一个实例,即基于Windows95下TCP/IP的可视电话的实 ...

  5. Windows下多线程编程

    前言 熟练掌握Windows下的多线程编程,能够让我们编写出更规范多线程代码,避免不要的异常.Windows下的多线程编程非常复杂,但是了解一些常用的特性,已经能够满足我们普通多线程对性能及其他要求. ...

  6. Windows下多线程编程 C/C++ —— 矩阵乘法的并行算法

    一.串行算法 设两个矩阵A和B,大小分别为M * N 和 N * P, 如果C = A * B, 则C的大小为M * P. 相应的代码表示如下: 这里可能大家直观想法可能是int A[M][N],但是 ...

  7. C++使用thread类多线程编程

    目录 pthread多线程 系统自带CreateThread std::thread c++ 多线程总结_jacke121的专栏-CSDN博客 std thread比较好用,但是系统带的socket不 ...

  8. C语言中pthread或Windows API在多线程编程中的基本应用

    文章目录 多线程概述 掌握多线程需要学习什么? 使用pthread.h实现多线程 使用Windows API实现多线程 使用threads.h实现多线程 参考资料 警告 由于我懒得写完,而且懂的也不是 ...

  9. Windows多线程编程总结

    Windows 多线程编程总结 keyword:多线程 线程同步 线程池 内核对象 1 内核对象 1 .1 内核对象的概念 内核对象是内核分配的一个内存块,这样的内存块是一个数据结构,表示内核对象的各 ...

最新文章

  1. SAP MM UB类型的退货STO流程简述
  2. FastDFS FAQ (欢迎反馈,我将及时整理)
  3. 异构网络垂直切换算法lte/wimax
  4. Linux电源管理(5)_Hibernate和Sleep功能介绍【转】
  5. butterknife 插件_知道这个插件,能让你的项目里少写1000行代码
  6. 机器学习 异常值检测_异常值是否会破坏您的机器学习预测? 寻找最佳解决方案
  7. 安卓布局中xml文件属性和ID简介
  8. 安装linux环境及相关包方法
  9. 【语义分割】Pyramid Scene Parsing Network(PSNET)
  10. MyEclipse问题收集
  11. CSS 盒模型 基本术语解释
  12. sqli-labs 第八关盲注脚本
  13. 整理好心情,在春天里上路···
  14. Ventrilo初学者指南,面向游戏玩家的VoIP应用
  15. 【软件测试技术期末复习选择题】
  16. 数据分析您需要一个现代化的数据仓库
  17. 数据驱动运营决策-框架与方法(下)
  18. css竖向箭头符号_用css制作空心箭头(上下左右各个方向均有)
  19. paper survey(2019.06.05)——卷积网络feature map的传递与利用
  20. 主分区损坏diskgenius_用DiskGenius(原DiskMan)修复损坏的硬盘分区

热门文章

  1. HTTP状态码100、200、300等含义
  2. Win10如何设置桌面右键新建菜单添加记事本选项并进行选项的排序和删除
  3. 计算机外观屏幕怎么设计,如何设计让电脑屏幕感觉高端?
  4. Rope --高效字符串处理数据结构
  5. JSP项目找不到MySQL驱动解决方法(已解决)
  6. 鸿蒙系统吃鸡视频,鸿蒙OS或将支持麒麟710及以后机型 严控应用推送,确保系统纯净...
  7. C语言中用for循环实现的倒金字塔
  8. 【跨境电商】独立站运营需要面临哪些困难?(二)
  9. Arduino 低功耗太阳能无线温湿度采集项目设计
  10. 31、STM8 CCO时钟输出