Ошибка сегментации (код выхода 139) при использовании 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), но вывод явно неправильный, поскольку не все потоки запускаются function до выхода основного процесса.

Когда я не комментирую это, я получаю segmentation fault (core dumped) при попытке запуска с использованием терминала в моей ОС Linux и Process finished with exit code 139 при запуске в моей среде IDE (CLion).

Я не смог найти ничего, что я сделал неправильно, так как это очень простая программа, в которой не должно быть ничего сложного, в чем проблема, которая вызывает ошибку?


person argamanza    schedule 17.05.2016    source источник
comment
Совет: Ошибка сегментации и Процесс завершен с кодом выхода 139 — синонимы. 139 = 0x80 | 11, который оболочка возвращает как код выхода, когда выполняемая ею программа завершается сигналом 11, ошибка сегментации.   -  person ikegami    schedule 17.05.2016


Ответы (1)


Вы должны были использовать pthread_join(threads[i], NULL); вместо pthread_join(threads[num], NULL);. Предположим, num устанавливается равным 4 через аргумент. Затем threads[num] указывает на 5-й элемент массива, который не существует, поскольку вы выделили массив только из 4 элементов.

person kuro    schedule 17.05.2016
comment
ну как-то смущает... Не заметил, глупый я... Спасибо! - person argamanza; 17.05.2016