我的问题是我想要使用线程更新一个矩阵乘以两个矩阵。以下是我的代码
#include <iostream>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <iostream>
#include <ctime>
#include <cmath>
#include <vector>
using namespace std;
int thread_count; // For Command Line Argument
int l;
int m;
int n;
int start_Task;
int stop_Task;
void *Hello(void* rank); // Prototype of a thread function
int main(int argc,char* argv[])
{
int thread_id;
thread_count = atoi(argv[1]);
int l = atoi(argv[2]);
int m = atoi(argv[3]);
int n = atoi(argv[4]);
int A[l][m]; //creates A l*m matrix or a 2d array.
for(int i=0; i<l; i++) //This loops on the rows.
{
for(int j=0; j<m; j++) //This loops on the columns
{
A[i][j] = i+j; // Allocating values to A matrix
}
}
int B[m][n]; //creates B m*n matrix or a 2d array.
for(int i=0; i<m; i++) //This loops on the rows.
{
for(int j=0; j<n; j++) //This loops on the columns
{
B[i][j] = i+j+1; // Allocating values to B matrix
}
}
int C[l][n]; //creates C m*n matrix or a 2d array.
int remainder = l % thread_count;
int allocatedProcess = l/thread_count;
start_Task =0;
//cout<<remainder<<" "<<allocatedProcess<<endl;
pthread_t myThreads[thread_count];
//creates a certain number of threads
for(thread_id = 0; thread_id < thread_count; thread_id++)
{
stop_Task = start_Task + allocatedProcess;
pthread_create(&myThreads[thread_id], NULL,Hello, (void*)thread_id);
start_Task = stop_Task;
}
cout<<"Hello from the main thread \n"<<endl;
for(int i=0; i<l; i++) //This loops on the rows.
{
for(int j=0; j<n; j++) //This loops on the columns
{
cout<<"Values in Final Matrix is"<<C[i][j]<<endl;
}
}
//wait until all threads finish
for(thread_id = 0; thread_id<thread_count; thread_id++)
pthread_join(myThreads[thread_id],NULL);
return 0;
}//main
void *Hello(void* rank)
{
for(int i=start_Task; i<stop_Task; i++) //This loops on the rows.
{
for(int j=0; j<n; j++) //This loops on the columns
{
int sum = 0;
for(int k=0; k<m; k++) //This loops on the columns
{
sum += A[i][k] * B[k][j]; // Allocating values to C matrix
//product[row][col] += aMatrix[row][inner] * bMatrix[inner][col];
}
C[i][j] = sum;
cout << C[i][j] << " ";
}
cout << "\n";
}
int my_rank = (long)rank;
cout<<"Thread_"<<my_rank<<" of "<<thread_count<<endl;
return NULL;
}
我面临的问题是,由于维度本身是全球性的,因此我无法全局化我的Matrix。请更新我正确的方式来实现它。
答案 0 :(得分:1)
简短的回答是C和C ++中的数组必须使用常量设置,而不是变量。
你的例子中的l和m不是常量。你可以使用std :: vector。如果您使用的是C ++ 11编译器,那么您还有其他几个选项。这是一个可能有用的线程,但是认真;谷歌&#34; 2d动态数组c ++&#34;看看还有什么。它对你来说是一个很好的练习,可以帮助我避免复制和粘贴所有这些精彩的文章!
答案 1 :(得分:0)
你可以通过声明一个指针来完成它。
int *my_array;
在任何方法中,您都可以使用以下行:
std::cin >> n;
my_array = new int[n];
希望这会有所帮助.. :)