pthreads多线程矩阵乘法

时间:2017-10-24 16:42:41

标签: c++ multithreading pthreads matrix-multiplication pthreads-win32

我目前正在尝试用pthreads.h编写一个用于多线程矩阵乘法的C ++程序。

我尝试按如下方式创建线程

int numthreads = (matrix[0].size() * rsize2);//Calculates # of threads needed
pthread_t *threads;
threads = (pthread_t*)malloc(numthreads * sizeof(pthread_t));//Allocates memory for threads
int rc;
for (int mult = 0; mult < numthreads; mult++)//rsize2
{
    struct mult_args args;
    args.row = mult;
    args.col = mult;
    cout << "Creating thread # " << mult;
    cout << endl;
    rc = pthread_create(&threads[mult], 0, multiply(&args), 0);
}

然后创建执行我的乘法函数的线程,编码如下

void *multiply(int x, int y)
{
    int oldprod = 0, prod = 0, sum = 0;
    cout << "multiply";

    for(int i = 0; i < rsize2; i++)//For each row in #ofrows in matrix 2
    {
        prod = matrix[x][i] * matrix2[i][y];//calculates the product
        sum = oldprod + prod; //Running sum starting at 0 + first product
        oldprod = prod; //Updates old product
    }

我的错误在于我的乘法函数。我试图找到一种兼容的方法来传递每个线程的x和y坐标,因此它具体知道要计算的总和,但我不知道如何以一种可接受的方式执行此操作。 pthreads_create()函数。

更新: 我知道我必须使用结构来完成这个

struct mult_args {
    int row;
    int col;
};

但我无法通过乘法函数来接受结构

1 个答案:

答案 0 :(得分:0)

您必须修改void*功能,以便只需一个x参数。为此,您需要创建一个结构来存储ypthread_create,并在struct multiply_params { int x; int y; multiply_params(int x_arg, int y_arg) noexcept : x(x_arg), y(y_arg) {} }; // ... for (int mult = 0; mult < numthreads; mult++) { cout << "Creating thread # " << mult; cout << endl; multiply_params* params = new multiply_params(1, 0); rc = pthread_create(&threads[mult], 0, multiply, (void*) params); } 中传递指向它的指针。

void*

然后在你的乘法函数中,像这样重写它,取一个multiply_params参数,它将是我们传递给pthread_create的{​​{1}}指针。您必须从void*转换此参数,以便我们可以访问其字段。

void* multiply(void* arg)
{
    multiply_params* params = (multiply_params*) arg;

    int x = params->x;
    int y = params->y;

    delete params; // avoid memory leak        
    // ...
}