我有以下有一些问题的c代码。
我想实现一个带线程的矩阵乘法(1dim数组)
Matrix MA
我有Matrix MB
和Matrix MBT
以及MA
,其值已切换为与Matrix
相乘。
我ARRAY_SIZE * ARRAY_SIZE
的尺寸由mmult
我正在尝试为矩阵的每一行创建一个线程,并在我的函数Segmentation fault (core dumped)
中将行与列相乘。
我收到的错误消息是:{{1}}
答案 0 :(得分:1)
即使您没有创建Minimal, Complete, and Verifiable Example来向我们展示(您确实应该拥有),但很容易猜到问题所在。
仔细看看如何创建线程:
pthread_create(&thread[row], NULL, &mmult,&row)
在这里传递一个指向变量row
的指针。现在,您将如何在线程函数中使用该参数:
int row = (intptr_t) r;
但是r
是int
的指针,它不是当前"行"的值。在创建线程时。
做
会更正确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,尽管可能还有其他一些错误。