Я делаю некоторые первые шаги с потоками в системах 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).
Я не смог найти ничего, что я сделал неправильно, так как это очень простая программа, в которой не должно быть ничего сложного, в чем проблема, которая вызывает ошибку?