当我使用pthread_join((时,我不确定它是否在正确的位置。 就像现在一样,它会等待线程退出后再再次遍历循环吗? 我想我要问的是我是否应该将其从双 for 循环中取出并直接在 pthread_join(( 之后创建一个新的 for 循环?
PS:我对一般的线程和 C 语言非常陌生。 我还有另一个关于释放 malloc 内容的问题(在代码中作为注释(。 我不确定在哪里使用 free 关键字,因为 malloc 结果指针在每次迭代内部 for 循环后都会消失。
这是我的代码。它用于两个预定义矩阵(A&B(上的矩阵乘法。 (这是老师希望我们这样做的方式(。
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#define M 3
#define K 2
#define N 3
int A[M][K] = {{1,4}, {2,5}, {3,6}};
int B[K][N] = {{8,7,6}, {5,4,3}};
int C[M][N];
struct coords
{
int i ; /* row */
int j ; /* column */
};
//thread function
void* calc_val(void* resultCoords)
{
int n, result = 0;
struct coords **matCoords = (struct coords**) resultCoords;
for(n = 0; n < K; n++)
{
result += A[(*matCoords)->i][n] * B[n][(*matCoords)->j];
}
C[(*matCoords)->i][(*matCoords)->j] = result;
// One more question:
// <- Should I free mem from malloc here?
}
int main(int argc, char** argv)
{
int numThreads = M * N, threadIndex = 0, i, j;
pthread_t threads[numThreads];
pthread_attr_t attributes[numThreads];
for (i = 0; i < M; i++)
{
for(j = 0; j < N; j++)
{
struct coords *data = (struct coords*)malloc(sizeof(struct coords));
data->i = i;
data->j = j;
pthread_attr_init(&attributes[threadIndex]);
pthread_create(
&threads[threadIndex],
&attributes[threadIndex],
calc_val,
&data);
pthread_join(threads[threadIndex], NULL); // <-Main Question
threadIndex++;
}
}
/* ... */
return (EXIT_SUCCESS);
}
在你的代码中,你基本上执行以下操作:
- 为线程准备一些数据
- 运行线程
- 等到它完成
- 转到下一个迭代
所以这个代码绝对是连续的
要使其非顺序,您需要这样的东西:
- 准备一些数据
- 运行线程
- 转到下一个迭代
- 等到所有线程完成
尝试这样的事情:
for (i = 0; i < M; i++)
{
for(j = 0; j < N; j++)
{
struct coords *data = (struct coords*)malloc(sizeof(struct coords));
data->i = i;
data->j = j;
pthread_attr_init(&attributes[threadIndex]);
pthread_create(&threads[threadIndex], &attributes[threadIndex], calc_val, &data);
threadIndex++;
}
}
for (i=0;i<numThreads;i++)
pthread_join(threads[i], NULL);
关于内存分配的下一个问题 - 您可以在所有线程完成后执行此操作(然后您需要将所有分配的指针存储在某个地方(,或者您可以按照您在评论中的要求释放每个线程