因此,当我运行我的代码时,我在pthread_join上遇到了分段错误。在我的pthread_join之后有一个没有运行的print语句。有谁知道为什么?你能给我一些关于如何解决这个问题的提示或想法吗?
输出打印出矩阵的所有行号,直到结束,然后它离开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;
}
答案 0 :(得分:7)
调用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 *)
由于代码似乎试图产生多个线程,所有应该连接perpare空间来存储几个pthread-id。
例如,可以使用如下数组来完成:
pthread_t tid[numberOfThreads] = {0};
然后创建这样的线程:
pthread_create(&tid[i], &attr, matrixCalc, NULL);
将线程号(计数器i
)传递给线程也通过定义
int thread_counts[numberOfThreads] = {0};
分配并在线程创建时将其作为4 th 参数传递:
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);
}
答案 1 :(得分:1)
int pthread_create(pthread_t * thread,const pthread_attr_t * attr,void *(* start_routine)(void *),void * arg);
第三个参数是一个启动函数,它取一个void ptr并返回一个void ptr。
第四个参数采用void ptr指向要传递的数据,在本例中为threadcnt。