使用 pthread_join 时出现分段错误(退出代码 139)
Segmentation fault (exit code 139) when using pthread_join
我正在 Linux 系统上使用线程做一些第一步,我有这个错误发生在一个程序的基础上,该程序获取一些 n
参数并创建 n
线程数。
这是代码的重要部分:
线程应具备的功能运行:
void* function(void* arg){
int id = (long)arg;
printf("Thread #%ld created!\n",id);
pthread_exit(0);
}
main
函数中的重要代码部分
int main(int argc, char **argv){
if(argc != 3){
printf("Usage: %s <num> <exp>\n",argv[0]);
exit(-1);
}
int num = atoi(argv[1]), exp = atoi(argv[2]);
long i;
pthread_t threads[num];
pthread_attr_t attr;
printf("Creating %d threads \n",num);
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
for (i = 0; i < num; i++) {
pthread_create(&threads[i],&attr,function,(void*)i);
}
pthread_attr_destroy(&attr);
for (i = 0; i < num; i++) {
printf("Thread #%d is %ld\n", i, threads[i]);
}
for (i = 0; i < num; i++) {
pthread_join(threads[num], NULL);
}
}
注意最后一个 for
循环与 pthread_join
函数,当我将其注释掉时,程序结束正常(退出代码 0),但输出显然是错误的,因为并非所有线程运行s function
在主进程退出之前。
当我不注释掉它时,当我尝试 运行 使用我的 Linux OS 和 Process finished with exit code 139
中的终端时,我得到 segmentation fault (core dumped)
运行宁在我的 IDE (CLion) 中。
我找不到任何我做错的地方,因为它是一个非常基本的程序,不应该很难找到任何东西,导致错误的问题是什么?
您应该使用 pthread_join(threads[i], NULL);
而不是 pthread_join(threads[num], NULL);
。假设,num
通过参数设置为 4。然后 threads[num]
指向数组的第 5 个元素,它不存在,因为你分配了一个只有 4 个元素的数组。
我正在 Linux 系统上使用线程做一些第一步,我有这个错误发生在一个程序的基础上,该程序获取一些 n
参数并创建 n
线程数。
这是代码的重要部分:
线程应具备的功能运行:
void* function(void* arg){
int id = (long)arg;
printf("Thread #%ld created!\n",id);
pthread_exit(0);
}
main
函数中的重要代码部分
int main(int argc, char **argv){
if(argc != 3){
printf("Usage: %s <num> <exp>\n",argv[0]);
exit(-1);
}
int num = atoi(argv[1]), exp = atoi(argv[2]);
long i;
pthread_t threads[num];
pthread_attr_t attr;
printf("Creating %d threads \n",num);
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
for (i = 0; i < num; i++) {
pthread_create(&threads[i],&attr,function,(void*)i);
}
pthread_attr_destroy(&attr);
for (i = 0; i < num; i++) {
printf("Thread #%d is %ld\n", i, threads[i]);
}
for (i = 0; i < num; i++) {
pthread_join(threads[num], NULL);
}
}
注意最后一个 for
循环与 pthread_join
函数,当我将其注释掉时,程序结束正常(退出代码 0),但输出显然是错误的,因为并非所有线程运行s function
在主进程退出之前。
当我不注释掉它时,当我尝试 运行 使用我的 Linux OS 和 Process finished with exit code 139
中的终端时,我得到 segmentation fault (core dumped)
运行宁在我的 IDE (CLion) 中。
我找不到任何我做错的地方,因为它是一个非常基本的程序,不应该很难找到任何东西,导致错误的问题是什么?
您应该使用 pthread_join(threads[i], NULL);
而不是 pthread_join(threads[num], NULL);
。假设,num
通过参数设置为 4。然后 threads[num]
指向数组的第 5 个元素,它不存在,因为你分配了一个只有 4 个元素的数组。