#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:
Проблемы:
void main()
является (как правило) недопустимой формой. Этоint main()
.- Код не вызывался
pthread_attr_init
.- Это похоже на причину ошибки сегментации — значения в
attr
неинициализированы, что приводитpthread_create
к странному поведению.
- Это похоже на причину ошибки сегментации — значения в
- Код передал указатель на
int
то, гдеvoid*
ожидается указатель наpthread_join
. - В кодексе этого не
#include lt;stdio.hgt;
было и#include lt;errno.hgt;