1

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

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

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

4

2 回答 2

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,而不是传递函数指针。我希望您的代码看起来更像这样(未测试!):(注意我更改了 的签名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;
}
于 2013-05-17T01:55:14.573 回答
0

错误

  1. 调用函数指针

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

在下面的 pthread_create 的 pthread 原型中

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

第一个参数 - pthread_variable

第二个参数 - 线程属性

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

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

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

示例程序:

#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);

}

更多细节在这里

于 2013-05-17T02:28:54.380 回答