没考虑过各种优化的第一个版本,仅保证计算正确.....

/**

* @file main.cpp

* @version 1.0.0

* @author Victor Zhang

* @date 2011-04-04

*/

#include

#include

#include

using std::cin;

using std::cout;

using std::endl;

struct matrixArgs

{

int *pMatrixLineA;

int *pMatrixLineB;

int *pResult;

int matrixLineCount;

};

void *calculate(void *arg)

{

matrixArgs *args = (matrixArgs*) arg;

*(args->pResult) = 0;

for (int i = 0; i < args->matrixLineCount; i++)

{

*(args->pResult) += (*(args->pMatrixLineA + i))

* (*(args->pMatrixLineB + i));

}

pthread_exit(NULL);

}

int main()

{

cout<

<

int i[3];

for (int j = 0; j < 3; j++)

{

while (!(cin>>i[j]))

{

cin.clear();

while (cin.get() != '\n') continue;

cout<

}

}

int matrixACount = i[1] * i[0];

int matrixBCount = i[2] * i[0];

int matrixResultCount = i[1] * i[2];

int *pMatrixA, *pMatrixB, *pMatrixResult;

matrixArgs *pMatrixArgs;

pMatrixA = (int*) malloc(matrixACount * sizeof(int));

pMatrixB = (int*) malloc(matrixBCount * sizeof(int));

pMatrixResult = (int*) malloc(matrixResultCount * sizeof(int));

pMatrixArgs =

(matrixArgs*) malloc(matrixResultCount * sizeof(matrixArgs));

cout<

for (int j = 0; j < matrixACount; j++)

{

while (!(cin>>(*(pMatrixA + j))))

{

cin.clear();

while (cin.get() != '\n') continue;

cout<

}

}

cout<

for (int j = 0; j < matrixBCount; j++)

{

while (!(cin>>(*(pMatrixB + (j / i[2] + (j % i[2]) * i[0])))))

{

cin.clear();

while (cin.get() != '\n') continue;

cout<

}

}

pthread_t *pPthread;

pPthread = (pthread_t*) malloc(matrixResultCount * sizeof(pthread_t));

void *status;

pthread_attr_t attr;

int rc;

pthread_attr_init(&attr);

pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

matrixArgs *pMatrixArgsCurrent = pMatrixArgs;

for (int j = 0; j < i[1]; j++)

{

for (int k = 0; k < i[2]; k++, pMatrixArgsCurrent++)

{

pMatrixArgsCurrent->matrixLineCount = i[0];

pMatrixArgsCurrent->pMatrixLineA = pMatrixA + (j * i[0]);

pMatrixArgsCurrent->pMatrixLineB = pMatrixB + (k * i[0]);

pMatrixArgsCurrent->pResult = pMatrixResult + (j * i[2] + k);

rc = pthread_create(pPthread + (j * i[2] + k),

&attr,

calculate,

(void*) pMatrixArgsCurrent);

if (rc)

{

cout<

<

exit(-1);

}

}

}

pthread_attr_destroy(&attr);

for (int j = 0; j < i[1]; j++)

{

for (int k = 0; k < i[2]; k++, pMatrixArgsCurrent++)

{

rc = pthread_join(*(pPthread + (j * i[2] + k)), &status);

if (rc)

{

cout<

exit(-1);

}

}

}

cout<

for (int j = 0; j < i[1]; j++)

{

for (int k = 0; k < i[2]; k++, pMatrixArgsCurrent++)

{

cout<

}

cout<

}

free(pMatrixA);

free(pMatrixB);

free(pMatrixResult);

free(pMatrixArgs);

free(pPthread);

pthread_exit(NULL);

return 0;

}

Linux多线程矩阵,操作系统实验——多线程计算矩阵相乘相关推荐

  1. Linux多线程矩阵,操作系统实验(进程)多线程实现矩阵乘法

    <操作系统实验(进程)多线程实现矩阵乘法>由会员分享,可在线阅读,更多相关<操作系统实验(进程)多线程实现矩阵乘法(6页珍藏版)>请在人人文库网上搜索. 1.多线程编程实现矩阵 ...

  2. 异构计算实验——CUDA计算矩阵幂

    CUDA计算矩阵幂 ** 一.实验内容 本次实验内容为基于CUDA的GPU实现矩阵的幂.要求分别用暴力算法和高效算法实现矩阵的幂. 对于一个 的方阵 ,计算的次幂.首先,生成一个的方阵,保证每行每列元 ...

  3. 实验四 linux进程控制实验报告,Linux系统进程控制操作系统实验报告4

    实验课程名称:操作系统 实验项目名称Linux系统进程控制实验成绩 实验者专业班级组别 同组者实验日期年月日第一部分:实验分析与设计(可加页) 实验内容描述(问题域描述) 要求:掌握Linux系统中进 ...

  4. VirtualBox安装及Linux基本操作(操作系统实验一)

    VirtualBox安装教程博客链接(转载)https://blog.csdn.net/u012732259/article/details/70172704 实验名称:Linux的基本操作 实验目的 ...

  5. python输入n×n的矩阵_Python使用shape计算矩阵的行和列

    POJ3255Roadblocks[次短路] Roadblocks Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12697 ...

  6. linux多线程编程实现圆周率,linux环境下使用Monte Carlo计算π

    1 实验题目 计算π的一个有趣方法是使用一个称为Monte Carlo的技术,这种技术涉及随机.该技术工作如下:假设有一个圆,它内嵌一个正方形,如下图所示. 首先,通过(x,y)坐标生成一系列的随机点 ...

  7. python numpy逆_Python使用numpy计算矩阵特征值、特征向量与逆矩阵

    原标题:Python使用numpy计算矩阵特征值.特征向量与逆矩阵 Python扩展库numpy.linalg的eig()函数可以用来计算矩阵的特征值与特征向量,而numpy.linalg.inv() ...

  8. Python使用numpy计算矩阵特征值、特征向量与逆矩阵

    Python扩展库numpy.linalg的eig()函数可以用来计算矩阵的特征值与特征向量,而numpy.linalg.inv()函数用来计算可逆矩阵的逆矩阵. >>> impor ...

  9. 计算机操作系统实验指导linux版,操作系统实验指导书(linux版).doc

    操作系统实验指导书(linux版) <操作系统>实验指导书 实验学时:16 适用专业:计算机科学与技术 实验一:进程和线程的创建 1. 在linux下编写一个应用程序,命名为an_ch2_ ...

最新文章

  1. 微软研究员:fork() 已落后,需要淘汰
  2. AI公开课:19.04.10颜水成—360副总裁《人工智能:观察与实践》课堂笔记以及个人感悟—191017再次更新
  3. elasticsearch virtual memory虚拟内存配置“max virtual memory areas vm.max_map_count [65530] is too low, inc
  4. Ubuntu16.04删除客人会话
  5. 计算机图形学与相关学科的关系,哈尔滨工业2015博士招生计算机图形学与人机交互设计大纲...
  6. mysql5.6 1g内存_1G内存用MySQL5.6还是用MySQL5.5比较好
  7. java cookie 取不到_java中Servlet Cookie取不到值原因解决办法
  8. 图像处理-二值形态学运算
  9. 人工智能:从单细胞生物的智能说起
  10. docker容器启动几分钟之后自动退出
  11. 又一程序员删库跑路,只不过他没跑掉,还被抓了~
  12. 【交易技术前沿】低时延基础设施杂谈
  13. 【PID优化】基于matlab天牛须算法PID控制器优化设计【含Matlab源码 1312期】
  14. 怎样写工科研究生论文
  15. 《Android第一行代码(第二版)》源码
  16. matlab图像频谱分析代码_信号频域分析方法的理解(频谱、能量谱、功率谱、倒频谱、小波分析)...
  17. windows调节屏幕文字清晰度、锐度,屏幕字体模糊怎么办,屏幕字体不清晰
  18. 上海淘融网络致广大客户的致歉信
  19. Unity3D ParticleSystem粒子系统
  20. elementui组件中,树形组件的使用

热门文章

  1. Castle IOC容器实践之EnterpriseLibrary Configuration Facility
  2. Android 异常: failed to connect to localhost/127.0.0.1
  3. 解决无法使用pip命令加载Python的扩展库问题
  4. 关于移动端上下滑动卡顿不流畅现象的解决方案
  5. 处理WCF异常的方式
  6. Win7 IIS7 HTTP 错误 404.2 - Not Found解决方法 ISAPI CGI
  7. 使用POI导出百万级数据到excel的解决方案
  8. 如何从Docker容器内部连接到计算机的本地主机?
  9. 什么是Android PendingIntent?
  10. Jmeter 压测 http(s)