从pthread函数返回向量?

时间:2018-09-29 21:02:16

标签: c parallel-processing pthreads

在从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 :(得分:0)

您不能将struct转换为void *指针。您需要根据情况用vector动态分配一个malloc,并返回指针。

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

现在,这将解决从返回struct的函数返回void *的问题。但是,如果您使用的是pthread,则不应从它们返回对象,您需要将vector作为用户数据传递给arg

答案 1 :(得分:0)

这可能是最简单的:

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

省去了与可疑的线程堆栈变量,malloc等相关的麻烦,并将结果输出直接与输入相关联。

答案 2 :(得分:0)

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;
    }