在我的程序中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/