水了一学期的院选修,万万没想到期末考试还有比较硬核的编程题,居然还涉及到多线程了,而且是调用Windows接口函数写多线程。虽然学汇编的时候有所了解,但毕竟没尝试过,思来想去,写出了下面的蹩脚代码,不足之处还望各位批评指正。题目描述如下:

  采用windows接口函数,编写一个计算矩阵向量相乘的并行程序,矩阵按行划分后分别散发到不同的线程中,向量被复制到各个线程中,程序执行结束时,由主线程输出结果向量。假设矩阵定义为浮点型数组A[64][64],向量定义为浮点型数组y[64],结果向量存放到浮点型数组z[64]中,所用处理器有8个计算核。

  开始分析:如果把矩阵按行分配给不同线程的话,很明显每个线程应该被分配八行。由于对不同行的矩阵进行操作不会发生冲突,所以连线程的同步机制都用不到,就是简单的编写一个计算矩阵向量相乘的线程函数,然后创建多个线程执行就可以了。代码实现如下:

 1 #include <windows.h>
2 #include <stdio.h>
3
4 double z[64]; //结果向量
5 double y[64]; //待乘向量
6 double A[64][64];//待乘矩阵
7 const int numThreads = 8;//线程数
8
9 DWORD WINAPI threadFunction(LPVOID pArg) {
10 int myNum = *((int *)pArg); //获取本线程所需参数
11 int n = myNum + 8; //设置外层循环上界
12 for(int i = myNum; i < n; ++i){//相乘计算的具体步骤
13 for(int j = 0; j < 64; ++j)
14 z[i] += A[i][j] * y[i];
15 }
16 return 0;
17 }
18
19 int main() {
20 HANDLE threadHandles[numThreads];//线程数组
21 int tNum[numThreads];//用于传给线程的参数数组
22
23 printf("请输入矩阵:\n");
24 for(int i = 0; i < 64; ++i)
25 for(int j = 0; j < 64; ++j)
26 scanf("%lf", &A[i][j]);
27
28 printf("请输入向量:\n");
29 for(int i = 0; i < 64; ++i)
30 scanf("%lf", &y[i]);
31
32 printf("相乘后的结果向量为: \n");
33
34 for(int i = 0; i < numThreads; ++i) {
35 tNum[i] = i * 8; //给传给线程的参数赋值
36 threadHandles[i] = CreateThread( NULL, // 安全属性
37 0, // 栈大小
38 threadFunction, // 传给线程的函数
39 (LPVOID)&tNum[i],// 传给线程的参数
40 0, // 线程创建后立即激活
41 NULL); // 新线程的id会被传给这个参数所在的变量
42 }
43 WaitForMultipleObjects( numThreads, // 等待的线程数
44 threadHandles, // 等待的线程数组
45 TRUE, // 等待所有信号量有效在往下执行
46 INFINITE); // 表示无穷等待
47 for(int i = 0; i < 64; ++i) //输出结果向量
48 printf("%.2lf ", z[i]);
49 return 0;
50 }

  至此,已经解决问题了。还好题目要求不是特别难,也算是通过一段代码初步了解如何使用Windows接口函数编写多线程了。不得不说C语言确实强大,可惜我基础不扎实加上现在又忘得差不多了,写这段代码时居然想通过scanf("%f",&变量名来输入double类型的值,迟迟得不到预期结果。我还以为是多线程惹的祸,得亏调试了一下才知道原来我连值都没有正确输进去,double类型的输入格式必须是%lf,输出的话%f%lf均可,学到了学到了。只有犯错了才能学的更透彻啊

使用Windows API 编写按行分配的计算矩阵向量相乘的并行程序的更多相关文章

  1. C++开发与Windows API

    Windows API 向 C++ 开发人员提出了一项挑战. 组成 API 的众多库大都表现为 C 语言风格的函数和句柄或是 COM 风格的接口. 这些用起来都不太方便,需要进行一定的封装或间接操作. ...

  2. Windows API的消息处理机制

    上个学期找实习失利,让我觉得自己基础打得不够牢固,所以在华为实习的这三个月里,每天下班都在复习理论课的知识,顺便刷了一个月的 LeetCode.本来以为找工作是势在必得了,结果这个学期秋季校招的坑爹经 ...

  3. 学习:Windows API核心DLL文件

    在 Windows 的系统目录中,存在着很多的动态链接库文件(DLL 文件).这些 DLL 文件中包括了 Windows API 函数可执行程序. DLL 将各函数"导出",这样应 ...

  4. Python调用Windows API函数编写录音机和音乐播放器

    功能描述: 1)使用tkinter设计程序界面: 2)调用Windows API函数实现录音机和音乐播放器. . 参考代码: ​ 运行界面: ​

  5. 浅谈Windows API编程

    WinSDK是编程中的传统难点,个人写的WinAPI程序也不少了,其实之所以难就难在每个调用的API都包含着Windows这个操作系统的潜规则或者是windows内部的运行机制…… WinSDK是编程 ...

  6. Windows API 函数列表 附帮助手册

    所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...

  7. VC Windows API获得桌面所有窗口句柄的方法

    VC Windows API应用之GetDesktopWindow ——获得桌面所有窗口句柄的方法 Windows API Windows 这个多作业系统除了协调应用程序的执行.分配内存.管理资源…之 ...

  8. Windows API学习---用户方式中的线程同步

    前言 当所有的线程在互相之间不需要进行通信的情况下就能够顺利地运行时, Micrsoft Windows的运行性能最好.但是,线程很少能够在所有的时间都独立地进行操作.通常情况下,要生成一些线程来处理 ...

  9. 关于Windows API、CRT和STL二三事

    1.本文编写目的    本文是为了帮助一些人弄清一些关于Windows API, C运行时程序库(CRT), 和标准C++库(STL)的基本概念.有很多人甚至是有经验的程序员在这些概念上是含糊不清的甚 ...

  10. 一些Windows API导致的Crash以及使用问题总结

    RegQueryValueEx gethostbyname/getaddrinfo _localtime64 FindFirstFile/FindNextFile VerQueryValue Crea ...

随机推荐

  1. oeasy 教您玩转 linux 之 010302 火狐浏览器 firefox

    我们来回顾一下 上一部分我们都讲了什么? oneko xeyes 这次看看这个火狐 火狐 看看当前版本 看看是否可以更新 如果需要更新就更新    firefox -v    apt search f ...

  2. 美团VS饿了么,到底谁更胜一筹?

    最近啊,收到一个粉丝的投稿,我发现他在美团和饿了么都去面试过. 这俩企业大家应该都经常用吧,咱点外卖的时候,我有时候就琢磨,到底他俩谁更厉害点. 今天咱们就瞅瞅,在面试这块儿谁更难一些. (目前都只有 ...

  3. 记一次 redis 事件注册不当导致的内存泄露

    线上的程序跑着跑着内存越来越大,并且没有下降的趋势,重启一下程序也只能短暂恢复.通过 htop 命令再按一下 M 键按内存占用大小排个序,程序会占好几个G.那好,让我们来分析一下. 收集dump 通过 ...

  4. 题解:AT_abc357_f [ABC357F] Two Sequence Queries

    题意 维护一个数据结构,支持两个数列的区间求和,和查询区间内两数列各元素积的和. 分析 线段树万岁! 这道题要维护两个序列,所以线段树中要同时存储两个区间和.但还要在维护一个信息,是该区间内两序列元素 ...

  5. ElementUI 基于vue+sortable.js实现表格行拖拽

    基于vue+sortable.js实现表格行拖拽 By:授客 QQ:1033553122 实践环境 sortablejs@1.13.0 vue@2.6.11 element-ui@2.13.2 安装s ...

  6. elasticsearch初步使用学习

    通过使用elasticsearch,我们可以加快搜索时间(直接使用SQL的模糊查询搜索耗时会比较久,而且elasticsearch的响应耗时与数据量关系不大) es主要用于存储,计算,搜索数据 依次部 ...

  7. chromedriver.exe存放位置

    chromedriver.exe存放位置 如果chromedriver.exe存放位置不对的话,driver=webdriver.Chrome() 会报错! 一般需要存放在python下面的Scrip ...

  8. Android studio报错:Failed to allocate a 3213123 byte allocation with 31231 free bytes and 189MB ontil 0OM

    这个问题是运行内存超了 在AndroidManifest中加入 android:hardwareAccelerated="false"android:largeHeap= &quo ...

  9. 2、SpringBoot2之入门案例

    2.1.创建Maven工程 2.1.1.创建空项目 2.1.2.设置项目名称和路径 2.1.3.设置项目sdk 2.1.4.项目初始状态 注意:需要关闭项目再重新打开,才能看到SpringBoot-P ...

  10. 【转载】 arch linux下nvidia 驱动死机问题

    原文地址: https://my.oschina.net/u/947271/blog/288063 ================================================== ...