Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的多线程矩阵乘法+;_C++_Multithreading_Posix - Fatal编程技术网

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
,因为它可以安全地复制。当然,你必须这样做 等待每个线程成功提取其数据,然后重试 循环以构造下一个线程。这通常是通过使用 条件:新线程将取消阻止条件