Возвращаемое значение pthread_create - PullRequest
4 голосов
/ 27 августа 2010

Я пытаюсь сделать следующий вызов,

PID = pthread_create(&t, NULL, schedule_sync(sch,t1), NULL);

schedule_sync возвращает значение, я хотел бы иметь возможность получить это значение, но из того, что я читал о pthread_create, вы должны передать "пустота "функция.Можно ли получить возвращаемое значение schedule_sync или мне придется изменить какой-то параметр, переданный в?

Спасибо за помощь!

Ответы [ 3 ]

4 голосов
/ 27 августа 2010

pthread_create возвращает код <errno.h>.Он не создает новый процесс, поэтому нет нового PID.

Чтобы передать указатель на вашу функцию, возьмите его адрес с &.

pthread_create принимает функцию в формеvoid *func( void * ).

Предполагая, что schedule_sync является функцией потока,

struct schedule_sync_params {
    foo sch;
    bar t1;
    int result;
    pthread_t thread;
} args = { sch, t1 };

int err = pthread_create( &args.thread, NULL, &schedule_sync, &args );
 .....

schedule_sync_params *params_ptr; // not necessary if you still have the struct
err = pthread_join( args.thread, &params_ptr ); // just pass NULL instead
 .....

void *schedule_sync( void *args_v ) {
   shedule_sync_params *args = args_v;
   ....
   args->result = return_value;
   return args;
}
2 голосов
/ 04 ноября 2013

Для того, чтобы перехватить возвращаемое значение дочернего потока в родительском (чтение как основной) поток.

Вы должны:

1) Соедините дочерние нити с основной нитью. Таким образом, основной поток остается и ждет, пока дочерние потоки выполнят свою работу и завершат работу.

2) Поймать возвращаемое значение дочернего потока при выходе. Дочерний поток должен вызвать pthread_exit (& ret_val), где ret_val содержит выходное значение функции (дочерний поток выполнялся)

Информация:

int pthread_join(pthread_t thread, void **rval_ptr);

void pthread_exit(void *rval_ptr);

Пояснение:

* Основная функция: *

После pthread_create присоединитесь к дочернему потоку:

pthread_join(thread_id, (void**)&(p_ret_val_of_child_thread));

Функция обработки дочерней резьбы:

  ret_val_of_child_thread = 10;

  pthread_exit(&ret_val_of_child_thread);
  } /* Child Thread Function Handler Ends */

Основная функция: После того, как дочерний поток завершит выполнение, можно получить его возвращаемое значение в основном потоке из "* (допустимый тип *) * p_ret_val_of_child_thread"

Второй аргумент pthread_join содержит возвращаемое значение выходного значения обработчика функции дочернего потока.

1 голос
/ 27 августа 2010

schedule_sync должен возвращать void *, который может быть любым.Вы можете получить значение с помощью pthread_join.

//Function shoulde be look like this
void* schedule_sync(void* someStructureWithArguments);

//Call pthread_create like so
pthread_create(&t, NULL, schedule_sync, locationOfSomeStructureWithArguments);

Когда поток завершается

pthread_joint(&t, locationToPutReturnValue);

У меня нет среды разработки, поэтому я пока не могу получить точную последовательность,но, надеюсь, это поможет вам начать.

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