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);
Другие вопросы по тегам