C++ C+中的多线程矩阵乘法+;
我在使用这个并行矩阵乘法代码时遇到了问题,当我试图访问我的结构中的数据成员时,我总是会出错 这是我的主要职能:C++ C+中的多线程矩阵乘法+;,c++,multithreading,posix,C++,Multithreading,Posix,我在使用这个并行矩阵乘法代码时遇到了问题,当我试图访问我的结构中的数据成员时,我总是会出错 这是我的主要职能: struct arg_struct { int* arg1; int* arg2; int arg3; int* arg4; }; int main() { pthread_t allthreads[4]; int A [N*N]; int B [N*N]; int C [N*N]; randomMatrix(A); randomMatrix
struct arg_struct
{
int* arg1;
int* arg2;
int arg3;
int* arg4;
};
int main()
{
pthread_t allthreads[4];
int A [N*N];
int B [N*N];
int C [N*N];
randomMatrix(A);
randomMatrix(B);
printMatrix(A);
printMatrix(B);
struct arg_struct *args = (arg_struct*)malloc(sizeof(struct arg_struct));
args.arg1 = A;
args.arg2 = B;
int x;
for (int i = 0; i < 4; i++)
{
args.arg3 = i;
args.arg4 = C;
x = pthread_create(&allthreads[i], NULL, &matrixMultiplication, (void*)args);
if(x!=0)
exit(1);
}
return 0;
}
struct arg\u struct
{
int*arg1;
int*arg2;
int arg3;
int*arg4;
};
int main()
{
pthread_t all threads[4];
int A[N*N];
intb[N*N];
int C[N*N];
随机矩阵(A);
随机矩阵(B);
印刷矩阵(A);
打印矩阵(B);
结构arg_struct*args=(arg_struct*)malloc(sizeof(struct arg_struct));
args.arg1=A;
args.arg2=B;
int x;
对于(int i=0;i<4;i++)
{
args.arg3=i;
args.arg4=C;
x=pthread_create(&allthreads[i],NULL,&matrixMultiplication,(void*)参数);
如果(x!=0)
出口(1);
}
返回0;
}
以及从另一个C文件使用的matrixMultiplication方法:
void *matrixMultiplication(void* arguments)
{
struct arg_struct* args = (struct arg_struct*) arguments;
int block = args.arg3;
int* A = args.arg1;
int* B = args.arg2;
int* C = args->arg4;
free(args);
int startln = getStartLineFromBlock(block);
int startcol = getStartColumnFromBlock(block);
for (int i = startln; i < startln+(N/2); i++)
{
for (int j = startcol; j < startcol+(N/2); j++)
{
setMatrixValue(C,0,i,j);
for(int k = 0; k < N; k++)
{
C[i*N+j] += (getMatrixValue(A,i,k) * getMatrixValue(B,k,j));
usleep(1);
}
}
}
}
void*矩阵乘法(void*参数)
{
struct arg_struct*args=(struct arg_struct*)参数;
int block=args.arg3;
int*A=args.arg1;
int*B=args.arg2;
int*C=args->arg4;
免费(args);
int startn=GetStartInefromBlock(块);
int startcol=getStartColumnFromBlock(block);
对于(int i=startn;i
我遇到的另一个错误是在创建线程时:“从'void()(int,int*,int,int*)到'void*()(void)[-fppermissive]的转换无效”
"
<> P> >谁可以告诉我我做错了什么?< /P> < P>首先,你很难混合C和C++,或者使用纯C或使用C++,C++中你可以简单地使用<代码>新< /COD>和<代码>删除< /> >
但是错误的原因是您在一个位置分配了
arg_struct
,然后在4个线程中释放它。你应该为每个线程分配一个<代码> AgjStReult,每个线程 首先,你非常容易混合C和C++,或者使用纯C或使用C++,C++中可以简单地使用<代码>新< /COD>和<代码>删除< /> >
但是错误的原因是您在一个位置分配了
arg_struct
,然后在4个线程中释放它。您应该为每个线程分配一个arg\u struct
从某种意义上说,大老板是正确的,他已经发现了问题,但要补充/补充他所做的回答
选项1:
只需在循环中创建一个arg_结构并设置成员,然后将其传递:
for(...)
{
struct arg_struct *args = (arg_struct*)malloc(sizeof(struct arg_struct));
args->arg1 = A;
args->arg2 = B; //set up args as now...
...
x = pthread_create(&allthreads[i], NULL, &matrixMultiplication, (void*)args);
....
}
arg_struct args;
//set up args as now...
for(...)
{
...
x = pthread_create(&allthreads[i], NULL, &matrixMultiplication, (void*)&args);
}
在线程中保持空闲
调用,但是现在可以直接使用传递的结构,而不是在线程中创建局部变量
选项2:
看起来您无论如何都希望将参数从结构内部复制到线程,因此不需要动态分配
只需创建一个arg_结构并设置成员,然后将其传递:
for(...)
{
struct arg_struct *args = (arg_struct*)malloc(sizeof(struct arg_struct));
args->arg1 = A;
args->arg2 = B; //set up args as now...
...
x = pthread_create(&allthreads[i], NULL, &matrixMultiplication, (void*)args);
....
}
arg_struct args;
//set up args as now...
for(...)
{
...
x = pthread_create(&allthreads[i], NULL, &matrixMultiplication, (void*)&args);
}
然后删除free
呼叫
但是,正如James指出的,您需要在结构上的线程/父线程中进行同步,以确保它没有被更改。这意味着一个互斥或其他机制。因此,将分配移动到for循环可能更容易开始。
第2部分:
我正在windows上工作(因此目前无法进行实验),但pthread_create param 3引用的是线程函数matrixMultiplication,它被定义为void*matrixMultiplication(void*)代码>-从联机手册页上看,我认为它是正确的(签名正确),void*fn(void*)
我想在你犯第二个错误时,我得听从别人的意见。将此帖子设置为comunnity wiki条目,以便在需要时可以将答案放入其中。从某种意义上说,大老板是正确的,他已经发现了问题,但要补充/补充他所做的回答
选项1:
只需在循环中创建一个arg_结构并设置成员,然后将其传递:
for(...)
{
struct arg_struct *args = (arg_struct*)malloc(sizeof(struct arg_struct));
args->arg1 = A;
args->arg2 = B; //set up args as now...
...
x = pthread_create(&allthreads[i], NULL, &matrixMultiplication, (void*)args);
....
}
arg_struct args;
//set up args as now...
for(...)
{
...
x = pthread_create(&allthreads[i], NULL, &matrixMultiplication, (void*)&args);
}
在线程中保持空闲
调用,但是现在可以直接使用传递的结构,而不是在线程中创建局部变量
选项2:
看起来您无论如何都希望将参数从结构内部复制到线程,因此不需要动态分配
只需创建一个arg_结构并设置成员,然后将其传递:
for(...)
{
struct arg_struct *args = (arg_struct*)malloc(sizeof(struct arg_struct));
args->arg1 = A;
args->arg2 = B; //set up args as now...
...
x = pthread_create(&allthreads[i], NULL, &matrixMultiplication, (void*)args);
....
}
arg_struct args;
//set up args as now...
for(...)
{
...
x = pthread_create(&allthreads[i], NULL, &matrixMultiplication, (void*)&args);
}
然后删除free
呼叫
但是,正如James指出的,您需要在结构上的线程/父线程中进行同步,以确保它没有被更改。这意味着一个互斥或其他机制。因此,将分配移动到for循环可能更容易开始。
第2部分:
我正在windows上工作(因此目前无法进行实验),但pthread_create param 3引用的是线程函数matrixMultiplication,它被定义为void*matrixMultiplication(void*)代码>-从联机手册页上看,我认为它是正确的(签名正确),void*fn(void*)
我想在你犯第二个错误时,我得听从别人的意见。将此帖子设置为comunnity wiki条目,以便在需要时将答案放入其中。我不清楚您想做什么。你开始一些线程,
然后从main
(退出流程)返回,然后再获取任何
结果来自他们
在这种情况下,我可能不会直接使用任何动态分配。
(我将对矩阵使用std::vector
,它将使用动态
内部分配。)没有理由动态分配
arg_struct
,因为它可以安全地复制。当然,你必须这样做
等待每个线程成功提取其数据,然后重试
循环以构造下一个线程。这通常是通过使用
条件:新线程将取消阻止条件