pthread_exit выдает возврат структуры
У меня есть структура
typedef struct something_t {
int a;
int b;
} VALUES;
В моей функции потока я делаю
VALUES values;
values.a = 10;
values.b = 11;
pthread_exit((void*)&values);
И я пытаюсь получить, делая
VALUES values;
pthread_join(thread, (void*)&values);
printf("A: %d\B: %d\n", values.a, values.b);
Значения, которые я получаю, странные каждый раз. Я не понимаю, как получить значения, которые я в итоге создаю в потоке. Я пытаюсь изучить потоки в C и, кажется, я понял это, но я не могу вернуть значения. Есть ли способ? Спасибо всем за помощь.
4 ответа
Вы пытаетесь вернуть стековую (локальную) переменную.
Это недопустимо и не будет работать, поскольку стек потока будет удален (или, по крайней мере, недействителен) при выходе из потока.
Чтобы исправить это:
VALUES *values = malloc(sizeof VALUES);
values->a = 1;
values->b = 2;
pthread_exit( values );
И тогда, когда вы присоединяетесь бесплатно значения
VALUES *res;
pthread_join( thread, &res );
...
free(res);
Добавление к ответу perh: используйте указатель типов, где это необходимо.
функция потока:
VALUES *values = (VALUES*) malloc(sizeof VALUES);
values->a = 1;
values->b = 2;
pthread_exit( (void*)values );
вызывающая функция:
VALUES *res;
pthread_join( thread_id, (void*)&res );
...
free(res);
Это безопасно и не будет генерировать предупреждения при компиляции.
Похоже, вы создаете объект стека в функции потока и используете его в pthread_exit
, Эта структура выходит из области видимости при выходе из функции потока, и вы останетесь с мусором.
Вы не используете структуру значений, которую вы передали pthread_join
,
Ваше приложение имеет неопределенное поведение, так как вы объявили структуру в стеке (и стеке вышедшего потока)
использование malloc
вместо:
VALUES *values = malloc(sizeof(VALUES);
values->a = 10;
values->b = 11;
pthread_exit(values);