在C中的pthread_join之后的段错误(核心转储)

时间:2013-05-17 01:43:50

标签: c unix pthreads pthread-join

我在程序中的pthread_join之后一直遇到一个seg错误(核心转储)。它打印出预期的结果就好了,但加入线程时会出现seg错误。我已经看过关于这个主题的其他几个讨论,但没有一个建议的解决方案似乎适用于我的情况。这是我的编译命令的样子(没有编译警告或错误):

$ gcc -Wall -pthread test.c -o test

这是输出:

$ ./test
1 2 3 4 5 6 7 8 9 10 
Segmentation fault (core dumped)

以下是代码:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

int array[10];

void *fillArray(int *size) {
  int i;

  for (i = 0; i < *size; i++) {
    array[i] = i+1;
  }

  return NULL;
}

int main (int argc, char *argv[])
{
  int i, rc;
  int size = 10;
  pthread_t thread;
  void *res, *end;

  //initialize the array
  for (i = 0; i < size; i++) {
    array[i] = 0;
  }

  rc = pthread_create(&thread, NULL, fillArray(&size), &res);
  if (rc != 0) {
    perror("Cannot create thread");
    exit(EXIT_FAILURE);
  }

  //print the array
  for (i = 0; i < size; i++) {
    if (array[i] != -1) 
      printf("%d ", array[i]);
  }
  printf("\n");

  rc = pthread_join(thread, &end);
  if (rc != 0) {
    perror("Cannot join thread");
    exit(EXIT_FAILURE);
  }

  return 0;
}

任何想法可能是什么原因?

2 个答案:

答案 0 :(得分:3)

这不能为我编译:它失败了

dummy.cpp: In function ‘int main(int, char**)’:
dummy.cpp:29: error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’
dummy.cpp:29: error:   initializing argument 3 of ‘int pthread_create(_opaque_pthread_t**, const pthread_attr_t*, void* (*)(void*), void*)’

这是因为您实际上正在调用fillArray并将其结果传递给pthread_create,而不是传递函数指针。我希望你的代码看起来更像是这样(UNTESTED!):(注意我更改了fillArray的签名,创建了数据结构类型以传递给fillArray,改变了pthread_create的调用方式)

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

int array[10];

struct fillArrayData {
  int * array;
  int size;
  int * result;
};

void *fillArray(void *void_data) {
  fillArrayData * data = (fillArray*)void_data;

  for (int i = 0; i < data.size; i++) {
    data.array[i] = i+1;
  }

  //You could fill in some return info into data.result here if you wanted.

  return NULL;
}

int main (int argc, char *argv[])
{
  int i, rc;
  int size = 10;
  pthread_t thread;
  void *res, *end;


  //initialize the array
  for (i = 0; i < size; i++) {
    array[i] = 0;
  }

  fillArrayData data;
  data.array = array;
  data.size = 10;

  rc = pthread_create(&thread, NULL, fillArray, &data);
  if (rc != 0) {
    perror("Cannot create thread");
    exit(EXIT_FAILURE);
  }

  //print the array
  for (i = 0; i < size; i++) {
    if (array[i] != -1) 
      printf("%d ", array[i]);
  }
  printf("\n");

  rc = pthread_join(thread, &end);
  if (rc != 0) {
    perror("Cannot join thread");
    exit(EXIT_FAILURE);
  }

  return 0;
}

答案 1 :(得分:0)

中的错误
  1. 调用函数指针

  2. 将参数传递给线程处理程序

  3. 在pthread_create下面的pthread原型中

    int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);
    

    第一个参数 - pthread_variable

    第二个参数 - 线程attrubutes

    第三个参数 - 线程处理程序(函数指针名称)

    第四个参数 - 变量需要传递线程处理程序。

    在第四个参数中 - 如果两个线程想要共享单个变量,则创建全局变量,并在创建线程时传递此变量。

    示例程序:

    #include <pthread.h>
    #include <stdio.h>
    #define NUM_THREADS     5
    
    void *PrintHello(void *threadid)
    {
        long tid;
        tid = (long)threadid;
        printf("Hello World! It's me, thread #%ld!\n", tid);
        pthread_exit(NULL);
    }
    
    int main (int argc, char *argv[])
    {
        pthread_t threads[NUM_THREADS];
        int rc;
        long t;
    
        for(t=0; t<NUM_THREADS; t++){
            printf("In main: creating thread %ld\n", t);
            rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
            if (rc){
                 printf("ERROR; return code from pthread_create() is %d\n", rc);
                 exit(-1);
            }
        }
    
        pthread_exit(NULL);
    
    }
    

    进一步详情here