gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:48:16 25 4
gpt4 key购买 nike

我的以下 C 代码存在一些问题。

我想用线程实现矩阵乘法(1dim数组)

pthread_t thread[ARRAY_SIZE];


void* mmult(void* r){
int row = (intptr_t) r;
int index;
int column, tmp, size = ARRAY_SIZE;
for(column = 0; column < size; column++){
tmp = 0;
for(index = 0; index < size; index++){
tmp += MA[row * size + index] * MBT[column * size + index];
}
MC[row * size + column] = tmp;
}

pthread_exit(NULL);


}
int main(void) {
int size = ARRAY_SIZE, row, column;
struct timeval start, end;
double exectime;

init_matrix(MA); //function to create Matrix
init_matrix(MB);



for(row = 0; row < size; row++){ /* create Array-Threads */

if(pthread_create(&thread[row], NULL, &mmult,&row) != 0){ //also doesnt work with (void*) &row
perror("Fehler beim Erstellen eines Feld-Threads");
exit(EXIT_FAILURE);
}
}

int i;
for(i =0; row < size; i++){
status = pthread_join(thread[i], NULL);
}


return 0;
}

我有Matrix MAMatrix MBMatrix MBT,其中值被切换以与MA相乘>.

我的矩阵的大小由ARRAY_SIZE * ARRAY_SIZE定义

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

我收到的错误消息是:段错误(核心转储)

最佳答案

即使您还没有创建 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;

关于C 编程 - pthread_create() 循环索引作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50528942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com