C pthread_连接处的分段错误

C pthread_连接处的分段错误,c,matrix,pthreads,posix,pthread-join,C,Matrix,Pthreads,Posix,Pthread Join,因此,当我运行代码时,我在pthread_连接处遇到了一个分段错误。在我的pthread_join之后有一个print语句没有运行。有人知道为什么吗?你能给我一些关于如何解决这个问题的提示或想法吗 输出打印出矩阵的所有行号,直到结束,然后离开matrixCalc函数并打印“创建线程后”。当我为1个线程输入一个参数时,就会发生这种情况 我在这里包含了代码的一小部分: int main(int argc, char*argv[]) { //takes in number of threads

因此,当我运行代码时,我在pthread_连接处遇到了一个分段错误。在我的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;
}
intmain(intargc,char*argv[])
{
//将线程数作为第一个参数
pthread_attr_init(&attr);
//在这里初始化矩阵
//通过matrixcalc传递线程数
对于(i=0;i
下面是矩阵计算函数:

    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;

}
void*matrixCalc(线程计数)
{
int i,j,sum,tempNum,currentRow;
currentRow=线程数;
总和=0;
而(当前行<1200)
{
//循环通过矩阵B的j列
对于(j=0;j
int pthread_create(pthread_t*thread,const pthread_attr_t*attr,void*(*start_例程)(void*),void*arg)

第三个参数是获取void ptr并返回void ptr的启动函数


第四个参数采用一个void ptr,指向要传递的数据,在本例中为threadcnt。

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

换行

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

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

事实上是一样的


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

所以改变这个

 void *matrixCalc(threadCount) 
会变成这样吗

 void * matrixCalc(void *) 

由于代码似乎试图产生多个线程,因此所有线程都应该加入到pare room中,以存储多个pthread id

例如,可以使用如下数组完成此操作:

pthread_t tid[numberOfThreads] = {0};
pthread_create(&tid[i], &attr, matrixCalc, NULL);
void * matrixCalc(void * pv) 
{
  int i, j, sum, tempNum, currentRow;
  currentRow = *((int*) pv);
  ...
然后像这样创建线程:

pthread_t tid[numberOfThreads] = {0};
pthread_create(&tid[i], &attr, matrixCalc, NULL);
void * matrixCalc(void * pv) 
{
  int i, j, sum, tempNum, currentRow;
  currentRow = *((int*) pv);
  ...

要将线程编号(计数器
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;
  ...
像这样:

pthread_t tid[numberOfThreads] = {0};
pthread_create(&tid[i], &attr, matrixCalc, NULL);
void * matrixCalc(void * pv) 
{
  int i, j, sum, tempNum, currentRow;
  currentRow = *((int*) pv);
  ...

最后,要加入所有线程,请使用循环替换对
pthread\u join()
的单个调用:

for (i = 0; i < numberOfThreads; ++i)
{
  pthread_join(tid[i], NULL);  
}
for(i=0;i
你应该检查
pthread\u create
是否失败…你能粘贴matrixCalc函数吗?@BitFiddlingCodeMonkey,我设置了x=pthread\u create,并检查了x!0是否为,但它是=0。@angyxpoo
pthread\u create()==0
对于每个线程?@tyilmaz我发布了矩阵calcI,我正在试图找出如何更改我的代码行以匹配此。对于第一个参数,我将使用&tid,对于第二个参数,我将使用&attr,对于第三个参数,我将使用void(*matrixCalc)(void*)?或&matrixCalc?我尝试使用的东西出现了错误。我试图创建一个指向我的threadCount的指针,但出现了错误。我能做一下吗&threadCount抱歉,今天很忙。请看alk的答案。他似乎已经差不多涵盖了。FWIW我们需要一个常见问题解答。至少三分之一的
pthread
que斯蒂恩似乎正是关于这一点。