水了一学期的院选修,万万没想到期末考试还有比较硬核的编程题,居然还涉及到多线程了,而且是调用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. 重磅来袭!MoneyPrinterPlus一键发布短视频到视频号,抖音,快手,小红书上线了

    MoneyPrinterPlus开源有一段时间了,已经实现了批量短视频混剪,一键生成短视频等功能. 有些小伙伴说了,我批量生成的短视频能不能一键上传到视频号,抖音,快手,小红书这些视频平台呢?答案是必 ...

  2. c 语言学习第六天

    数组 语法: 类型 数组名[元素个数]; int a[6]; // 4*6 字节 char b[24]; // 1*24 字节 double c[2]; // 2*8 字节 访问数组中的元素 语法: ...

  3. CF414B

    这道题dp状态表示需要一点思维,而且会卡到时间复杂度 之前题主用的是试除法,时间复杂度为n^2.5,然后被卡了,但是换一种写法就是对的 #include <iostream> #inclu ...

  4. Pytorch功能库留存

    初始化 首先,介绍我们导入的包和基础的网络结构 import torch import torch.nn as nn #可替代网络结构部分 ''' 神经网络类的定义 1. 输入卷积: in_chann ...

  5. 搜索Python编程获取相关图书信息

    1.获取相关图书信息 #搜索"Python编程"获取相关图书信息 from selenium import webdriver from selenium.webdriver.su ...

  6. 推荐王牌远程桌面软件Getscreen,所有的远程桌面软件中使用最简单的一个

    今天要推荐的远程桌面软件就是这款叫Getscreen的,推荐理由挺简单: 简单易用:只需要两步就能轻松连上远程桌面 第一步:在需要被远程连接的机器上下载它的Agent程序并启动,点击Send获得一个链 ...

  7. Error: Dynamic require of "path" is not supported

    failed to load config from D:\BaiduSyncdisk\vue3\sys-manager\vite.config.jserror when starting dev s ...

  8. 折腾指南: 将光猫改造成你的NAS,WebDAV+网页文件管理器vList5+natmap

    原文:https://hi.imzlh.top/2024/07/18.cgi (预发布) 很久没有写完全折腾类文章了,这还得追溯到上次折腾S905L3A那会. 这篇文章很长,但是是小白级包学会. 为什 ...

  9. 为什么学编程都从helloworld开始?

    你好世界 回忆上次内容 上次 了解了 游乐场规则 REPL       添加图片注释,不超过 140 字(可选)   print函数 可以输出 字符串"h"     添加图片注释, ...

  10. 踩坑记录:windows11下使用 VS2022 和 PCL1.14.1 配置点云开发环境

    闲话不多说,具体在windows下下载PCL与解压pcl可以看https://www.yuque.com/huangzhongqing/pcl/这位大佬的文章,那我就具体说一下踩过点坑: 踩坑点1: ...