pthread_ создать в c создает ошибку сегментации

#c

#c

Вопрос:

Мой учитель поместил этот код на свои слайды и позволил нам попробовать запустить его, но когда я запускаю, я получаю ошибку «ошибка сегментации». После некоторой отладки я обнаружил, что источником ошибки является функция pthread_create (), если я передаю параметр amp;attr, он выдает ошибку, но если я передаю значение NULL, все работает нормально.
Я полностью понимаю, что должен делать этот код, но я не понимаю, почему он выдает ошибку.

 #include lt;pthread.hgt;  #includelt;unistd.hgt; //threadAttr.c void *my_fun(void *param){  printf("This is a thread that received %dn", *(int *)param);  return (void*)3; } void main(){  pthread_t t_id; pthread_attr_t attr;  int arg=10, detachSTate;  pthread_attr_setdetachstate(amp;attr,PTHREAD_CREATE_DETACHED); //Set detached  pthread_attr_getdetachstate(amp;attr,amp;detachSTate); //Get detach state  if(detachSTate == PTHREAD_CREATE_DETACHED)   printf("Detachedn");   pthread_create(amp;t_id, amp;attr, my_fun, (void *)amp;arg);    printf("Executed thread with id %ldn",t_id);  pthread_attr_setdetachstate(amp;attr,PTHREAD_CREATE_JOINABLE); //Inneffective  perror("");  sleep(3);  int esito = pthread_join(t_id, (void **)amp;detachSTate);   printf("Esito '%d' is different 0n", esito); }  

Комментарии:

1. (void **)amp;detachSTate Нет. Вы должны передать указатель void* , а не указатель на что-то другое.

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

Ответ №1:

Проблемы:

  1. void main() является (как правило) недопустимой формой. Это int main() .
  2. Код не вызывался pthread_attr_init .
    • Это похоже на причину ошибки сегментации — значения в attr неинициализированы, что приводит pthread_create к странному поведению.
  3. Код передал указатель на int то, где void* ожидается указатель на pthread_join .
  4. В кодексе этого не #include lt;stdio.hgt; было и #include lt;errno.hgt;