在从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;
}
我在关于返回结果和加法部分的最后两行中出错。谢谢
答案 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;
}