c - 使用 pthread_join 时出现段错误(退出代码 139)

标签 c linux multithreading pthreads 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);
    }

}

请注意带有 pthread_join 函数的最后一个 for 循环,当我将其注释掉时,程序正常结束(退出代码 0),但输出显然是错误的,因为不是所有线程在主进程退出之前都运行function

当我不注释掉它时,当尝试在我的 Linux 操作系统中使用终端运行时,我会遇到段错误(核心转储),并且进程已完成,退出代码为 139 在我的 IDE (CLion) 中运行时。

我找不到任何我做错的事情,因为这是一个非常基本的程序,不应该有任何难以找到的东西,导致错误的问题是什么?

最佳答案

您应该使用pthread_join(threads[i], NULL);而不是pthread_join(threads[num], NULL);。假设,num 通过参数设置为 4。然后 threads[num] 指向数组的第 5 个元素,该元素不存在,因为您分配了一个仅包含 4 个元素的数组。

关于c - 使用 pthread_join 时出现段错误(退出代码 139),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37281675/

相关文章:

c - 如何在c中打印字符串末尾没有p┐的字符串

c - 用于 FPGA 的开源 OCR 系统

java - apt-get install -y openjdk-8-jdk 失败

linux - 多次学习的tomcat奇怪问题

c - 从分隔符 "/"中提取字符串

c - 在适当的位置添加一个节点(列表将按升序排列)

有人可以告诉我使用 fork() 系统调用的程序有什么问题吗(编程 C)

Python 线程 'While' 不正常

java - Web容器创建的线程和普通线程有什么区别?

c# - 多线程 Console.ReadKey() 的奇怪行为