pthread实现多线程矩阵
时间: 2023-10-07 14:05:26 浏览: 249
下面是一个使用pthread实现多线程矩阵乘法的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define ROWS 1000
#define COLS 1000
int mat1[ROWS][COLS], mat2[ROWS][COLS], res[ROWS][COLS];
// 矩阵乘法的计算函数
void* multiply(void* args) {
int row = *(int*)args;
for (int j = 0; j < COLS; ++j) {
res[row][j] = 0;
for (int k = 0; k < ROWS; ++k) {
res[row][j] += mat1[row][k] * mat2[k][j];
}
}
pthread_exit(NULL);
}
int main() {
// 初始化两个矩阵
for (int i = 0; i < ROWS; ++i) {
for (int j = 0; j < COLS; ++j) {
mat1[i][j] = rand() % 100;
mat2[i][j] = rand() % 100;
}
}
// 创建线程
pthread_t threads[ROWS];
for (int i = 0; i < ROWS; ++i) {
int* arg = malloc(sizeof(*arg));
*arg = i;
pthread_create(&threads[i], NULL, multiply, arg);
}
// 等待线程完成
for (int i = 0; i < ROWS; ++i) {
pthread_join(threads[i], NULL);
}
// 打印结果
for (int i = 0; i < ROWS; ++i) {
for (int j = 0; j < COLS; ++j) {
printf("%d ", res[i][j]);
}
printf("\n");
}
return 0;
}
```
在这个示例代码中,我们首先定义了两个矩阵 `mat1` 和 `mat2`,以及一个结果矩阵 `res`,并对 `mat1` 和 `mat2` 进行了随机初始化。然后,我们创建了 `ROWS` 个线程,每个线程负责计算结果矩阵 `res` 的一行。在线程函数 `multiply` 中,我们使用两个循环分别计算了结果矩阵 `res` 的一行中的每个元素。最后,我们等待所有线程完成,并打印结果矩阵。
需要注意的是,在创建线程时,我们需要将每个线程要计算的行数作为参数传递给线程函数 `multiply`,因此我们需要在创建线程前动态地分配内存来存储这些参数,并在线程函数结束后释放该内存。
阅读全文