C编程 - pthread_create()循环索引作为参数

时间:2018-05-25 12:11:16

标签: c multithreading

我有以下有一些问题的c代码。

我想实现一个带线程的矩阵乘法(1dim数组)

Matrix MA

我有Matrix MBMatrix MBT以及MA,其值已切换为与Matrix相乘。

ARRAY_SIZE * ARRAY_SIZE的尺寸由mmult

定义

我正在尝试为矩阵的每一行创建一个线程,并在我的函数Segmentation fault (core dumped)中将行与列相乘。

我收到的错误消息是:{{1}}

3 个答案:

答案 0 :(得分:1)

即使您没有创建Minimal, Complete, and Verifiable Example来向我们展示(您确实应该拥有),但很容易猜到问题所在。

仔细看看如何创建线程:

pthread_create(&thread[row], NULL, &mmult,&row)

在这里传递一个指向变量row的指针。现在,您将如何在线程函数中使用该参数:

int row = (intptr_t) r;

但是rint指针,它不是当前"行"的值。在创建线程时。

会更正确
int row = *(int *) r;

但是 这将导致另一个问题:所有线程函数都将使用完全相同的指针调用,所有指向同一个地方。由于您无法控制线程何时开始运行,因此您不知道所有线程是否会为row获取不同的值,或者是否可能存在重复值。

要解决此问题,您需要在创建线程时传递row变量的。这是少数几个可以将值转换为指针的地方之一。它实际上需要两个演员阵容:

pthread_create(&thread[row], NULL, &mmult,(void *) (intptr_t) row)

现在,你需要在获取线程内的值时执行相反的操作:

int row = (int) (intptr_t) r;

答案 1 :(得分:0)

您的功能已经是void *,无需通过引用传递它。您已将引用传递给void *,而不是传递void *本身。而是尝试pthread_create(&thread[row], NULL, mmult, &row)

答案 2 :(得分:0)

这是函数pthread_create的语法。

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

第一个参数是pthread_t类型,代表线程ID,尽管可能还有其他一些错误。