在我的程序中pthread_join之后,我一直得到一个seg错误(core dump)。它可以很好地打印出预期的结果,但是在连接线程时会出现seg错误。我已经看了关于这个话题的其他一些讨论,但是没有一个建议的解决方案在我的案例中起作用。下面是我的compile命令的外观(没有编译警告或错误):

$ 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;
}

有什么原因吗?

最佳答案

这不是为我编译的:它失败了

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,而不是传递函数指针。我希望您的代码将需要看起来更像这样(未经测试!):(注意,我更改了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;
}

关于c - C中的pthread_join之后出现段故障(内核已转储),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16600172/

10-12 16:07