Функция запуска потока в библиотеке 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;
}