Вернуть вектор из функции pthread? - PullRequest
0 голосов
/ 30 сентября 2018

возникли проблемы с поиском синтаксиса возврата вектора из функции pthread.Вот что у меня сейчас:

typedef struct vectorData {
    vector v1;
    vector v2;
} vectorData;

void *vectorAddThread(void *arg) {
    vectorData *data = (vectorData *)arg;
    vector v1 = data->v1;
    vector v2 = data->v2;
    vector result = {v1->x + v2->x, v1->y + v2->y, v1->z + v2->z};
    return (void*) result;
}

В последних двух строках я получаю сообщения об ошибках и о добавляемой части.Спасибо

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018

Это, вероятно, проще всего:

typedef struct vectorData {
    vector v1;
    vector v2;
    vector result;
} vectorData;

Сохраняет беспорядок в сомнительных переменных стека потоков, mallocs и т. Д. И связывает вывод результатов непосредственно со входами.

0 голосов
/ 01 октября 2018

Функция запуска потока в библиотеке pthread возвращает указатель на void.Может вернуть любой тип указателя, приведя его к типу (void *).Pthread_join (3) может получить доступ к возвращаемому значению.

Однако, вектор также нуждается в типе информации об элементе.Не уверен, что приведение типа к (void *) и повторный доступ к нему будут работать нормально.Использование его в качестве элемента структуры выглядит лучше.

В следующем примере я возвращаю указатель на структуру из функции запуска потока.Структура содержит векторный и два символьных массива.Вы можете изменить его в соответствии с вашими требованиями.Я использую два указателя, чтобы показать, что данные копируются в переменную, используемую для pthread_join (3).

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <pthread.h>
    #include <errno.h>
    #include <vector>

    void *functionPthread(void *);

    struct retStruct
    {
            std::vector<int> vecNumber;
            char name[20];
            char city[20];
    };

    struct retStruct *r2;
    struct retStruct *r1;

    int main()
    {
            int rc, i;
            pthread_t th;

            r2 = (retStruct*) malloc(sizeof(retStruct));
            memset(r2, '\0', sizeof(r2));

            if(rc = pthread_create(&th, NULL, &functionPthread, NULL))
            {
                    printf("Thread creation failed, return code %d, errno %d", rc,                 errno);
            }

            pthread_join(th, (void**)&r2);

            for(i = 0; i < r2->vecNumber.size(); i++)
                    printf("Vectore element at index %d = %d\n", i, r2->vecNumber.at(i));

            printf("Name: %s, City: %s, Vector Number: %d\n", r2->name, r2->city, r2->vecNumber.front());
            free(r1);
            free(r2);
            return 0;
    }

    void *functionPthread(void *)
    {
            r1 = (retStruct*) malloc(sizeof(retStruct));
            memset(r1, '\0', sizeof(r1));
            strcpy(r1->name, "xxxx");
            strcpy(r1->city, "yyyy");
            r1->vecNumber.push_back(11);
            r1->vecNumber.push_back(12);
            return r1;
    }
0 голосов
/ 30 сентября 2018

Вы не можете конвертировать struct в void * указатель.Вам необходимо динамически выделить vector в вашем случае с malloc и вернуть указатель.

vector *result = malloc(sizeof(vector));
result->x = ?;
result->y = ?;
result->z = ?;
return (void *)result;

Теперь это решило бы проблему возврата struct из функции, которая возвращает void *,Но если вы используете pthreads, вы не должны возвращать объекты из них, вам нужно передать vector в качестве пользовательских данных в arg.

...