Возвращаемый тип Pthread Create с использованием C ++ - PullRequest
0 голосов
/ 19 марта 2012

Я пытаюсь создать функцию, которая возвращает объект определенного типа. Проблема в том, что создание потока не принимает его. Может ли кто-нибудь помочь мне со следующим кодом?

struct thread_args
 {
    Key *k;
    QNode *q;
    uint8_t USED_DIMENSION;
};

QLeafNode *st ;
  struct thread_args Structthread2;
     Structthread1.k=min;
     Structthread1.q=start;
      Structthread1.USED_DIMENSION=4 ;

pthread_create( &thread1, NULL,(void*)&FindLeafNode,  ((void *) &Structthread1));
pthread_join( thread1, (void**)st);

QLeafNode* FindLeafNode (Key *k, QNode * r, uint8_t USED_DIMENSION ){

}

Ответы [ 2 ]

3 голосов
/ 19 марта 2012

Во-первых, ваша функция потока не определена правильно. Только функции вида:

void* function_name(void* param)

может быть передано pthread_create.

Теперь, чтобы вернуть указатель на что-то из этой функции, вам нужны две функции pthread:

pthread_exit(void *value_ptr);

Вызовите это внутри функции потока, чтобы вернуть значение через value_ptr и

pthread_join(pthread_t thread, void **value_ptr);

Вызвать это внутри родительского потока, чтобы дождаться завершения дочернего процесса с дескриптором thread и получить значение, возвращаемое pthread_exit в value_ptr.

Итак, ваш код должен выглядеть примерно так:

struct thread_args
 {
    Key *k;
    QNode *q;
    uint8_t USED_DIMENSION;
};

QLeafNode *st ;
struct thread_args Structthread1;
Structthread1.k=min;
Structthread1.q=start;
Structthread1.USED_DIMENSION=4 ;

pthread_create(&thread1, NULL, FindLeafNode,  ((void *) &Structthread1));
pthread_join(thread1, (void**)st);

...

void* FindLeafNode (void* param) {
    struct thread_args* value = (struct thread_args*) param;
    // use value for computations
    QLeafNode* result = ... // allocate result with new / malloc
    pthread_exit((void*)result);
}
0 голосов
/ 19 марта 2012

возвращает выделенный в куче указатель на [поэтому используйте new для его выделения] ваш новый объект (выделенный в потоке и, возможно, позже освобожденный в присоединяющемся к нему «родительском» потоке, то есть с использованием результата).

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