Ошибка чтения возвращаемого значения из передачи указателя структуры в pthread_exit () в C - PullRequest
1 голос
/ 19 мая 2019

Я пытаюсь передать указатели на struct lower_hyper_id из потока в основной поток с помощью функции pthread_exit (), которая сравнивает и выводит значение в структуре. Тем не менее, я получаю сообщение об ошибке (ошибка сегментации), когда я пытаюсь использовать возвращаемое значение и привести его к структуре.

поток, который создает и возвращает структуру:

void *compute(void *arg){
   lower_hyper_id *data = (lower_hyper_id *)malloc(sizeof(lower_hyper_id));

   //some code
   //i debug the program, and at this point, the struct i want
   //to return has the values i want.

   pthread_exit((void *)data);
}

в основном:

lower_hyper_id l_hyper_id;

int main(){
    void *ap_state;
    lower_hyper_id values;
    void *ret;

    //some code

    for (int i = 0; i < NUMBER_OF_FILTERING_THREADS; i++)
    {
        s = pthread_join(filtering_threads[i], (void *)&ret);
        //some error checking 

        values = *((lower_hyper_id *)ret);  //this is where i receive the error

        if (values.lowest_cost <= l_hyper_id.lowest_cost)
        {
            l_hyper_id.hyper_id = values.hyper_id;
            l_hyper_id.lowest_cost = values.lowest_cost;
        }
        free(ret);
}

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

1 Ответ

0 голосов
/ 19 мая 2019

Вы не тестируете, если malloc вернул NULL.Это может быть проблемой, если вы выделяете большой кусок, и выделение может быть неудачным.Кроме этого, я не думаю, что проблема в передаче возвращаемого значения.

pthread_exit() с указателем malloc d должно работать просто отлично.

Пример минимальной работы:

#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void *compute (void *arg)
{
    printf("thread=%llx\n", (unsigned long long)pthread_self());
    size_t sz = strlen("hello world")+1;
    char *ret = malloc(sz+1);
    if(ret) memcpy(ret, "hello world", sz+1);
    return ret;
}
int main()
{
    printf("thread=%llx\n", (unsigned long long)pthread_self());
    pthread_t ptid;
    int er;
    if((er=pthread_create(&ptid,0,compute,0))) return errno=er,perror(0),1;
    void *retval;
    if((er=pthread_join(ptid,&retval))) return errno=er,perror(0),1;
    printf("thread returned: %s\n", (char*)retval);
    free(retval);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...