gpt4 book ai didi

c - pthread_join 处的段错误

转载 作者:行者123 更新时间:2023-12-02 00:52:05 27 4
gpt4 key购买 nike

因此,当我运行代码时,我在 pthread_join 处遇到段错误。我的 pthread_join 之后有一条打印语句未运行。有谁知道为什么吗?你能给我一些关于如何解决这个问题的提示或想法吗?

输出打印出矩阵的所有行号,直到最后,然后它离开matrixCalc函数并打印“创建线程后”。当我为 1 个线程添加参数时会发生这种情况。

我在这里包含了一小部分代码:

int main(int argc, char*argv[]) 
{
//takes in number of threads as 1st arg
pthread_attr_init(&attr);
//initialize matrix here

//passes num of threads through matrixcalc
for(i = 0; i < numberOfThreads; i++)
{
threadCount++;
pthread_create(&tid, &attr, matrixCalc(threadCount), NULL);
}
printf("after threads are created\n");
pthread_join(tid, NULL);
printf("after join\n");
exit(0);
return 0;
}

这是矩阵计算函数:

    void *matrixCalc(threadCount) 
{
int i, j, sum, tempNum, currentRow;
currentRow = threadCount;
sum=0;

while(currentRow < 1200)
{
//cycles through the column j for matrix B
for(j=0; j<500; j++)
{
//cycles through the diff i values for the set row in matrix A and column in matrix B
for(i=0; i<1000; i++)
{
//Matrix A set i value is at threadcount-1
//Matrix B i value = j
//Matrix B j value = i
//Multiply together and add to sum
tempNum = (matrixA[currentRow-1][i])*(matrixB[i][j]);
sum = sum+tempNum;
}
//Set Matrix C at i value = currentRow and jvalue = i to sum
matrixC[currentRow-1][j] = sum;
//printf("%d\n", matrixC[currentRow-1][i]);
}
//increase threadcount by number of threads
//until you hit max/past max val
currentRow = currentRow + nThreads;
//printf("%d\n", currentRow);
}
return NULL;

}

最佳答案

当调用pthread_create()时,您需要传递void *(*)(void *)类型的函数的地址。代码的作用是调用那里的函数,以便将其结果传递给 pthread_create()

更改此行

pthread_create(&tid, &attr, matrixCalc(threadCount), NULL);  

成为

pthread_create(&tid, &attr, matrixCalc, NULL);  

pthread_create(&tid, &attr, &matrixCalc, NULL);  

事实上是一样的。

<小时/>

如上所述,线程函数需要声明为 void *(*)(void *)

所以改变这个

 void *matrixCalc(threadCount) 

会变成这样

 void * matrixCalc(void *) 
<小时/>

由于代码似乎尝试生成多个线程,并且所有线程都应该连接起来,准备空间来存储多个 pthread-id。

这可以使用如下数组来完成:

pthread_t tid[numberOfThreads] = {0};

然后像这样创建线程:

pthread_create(&tid[i], &attr, matrixCalc, NULL);
<小时/>

要将线程号(计数器i)传递给线程,还可以通过定义为其提供空间

int thread_counts[numberOfThreads] = {0};

分配它并将其作为线程创建时的第四个参数传递:

 thread_counts[i] = i;
pthread_create(&tid[i], &attr, matrixCalc, &thread_Counts[i]);

往下线程函数中修改即可获取

void *matrixCalc(threadCount) 
{
int i, j, sum, tempNum, currentRow;
currentRow = threadCount;
...

像这样:

void * matrixCalc(void * pv) 
{
int i, j, sum, tempNum, currentRow;
currentRow = *((int*) pv);
...
<小时/>

最后,加入所有线程,用循环替换对 pthread_join() 的单个调用:

for (i = 0; i < numberOfThreads; ++i)
{
pthread_join(tid[i], NULL);
}

关于c - pthread_join 处的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20200622/

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