Как передать аргумент функции потока pthread в C? - PullRequest
0 голосов
/ 04 мая 2020

Можно ли передать аргумент функции потока в pthreads? Скажем, я создаю тему:

int main() {
  pthread_t t1;
  pthread_create(&t1, NULL, callback, 10);
  pthread_join(t1, NULL);
  return 0;
}

А в callback я бы хотел просто распечатать 10. Моя проблема теперь , что согласно C pthread API , сигнатура функции pthread_create():

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

Могу ли я передать указатель на целое число в потоке функция и как?

Ответы [ 2 ]

3 голосов
/ 04 мая 2020

Вы можете использовать переменную, например:

  int val = 10;
  pthread_create(&t1, NULL, callback, &val);
  pthread_join(t1, NULL);
  ...

И в callback:

void* callback(void *arg)
{
    int i = *(int *)arg;
    ....

    return NULL;
}

Обратите внимание, что это работает, потому что время жизни val действует до поток (callback) завершает свое выполнение, пока вы ждете с pthread_join(). В противном случае вы можете динамически выделять память (например, malloc) и передавать этот объект функции потока.

0 голосов
/ 04 мая 2020

Для одного значения целочисленного типа, не превышающего intptr_t, можно и довольно часто приводить его к указателю в вызове pthread_create и возвращать его обратно в функции потока:

int main() {
    pthread_t t1;
    pthread_create(&t1, NULL, callback, (void *) 10);
    pthread_join(t1, NULL);
    return 0;
}


void *t1(void *arg) {
    int arg_as_int = (int) arg;
    // ...
}

Такое приведение определенно разрешено, и опять же, оно довольно условно.

Недавно я начал видеть возражения против этого подхода здесь, на SO, однако, на основании того, что стандарт C разрешает первое из этих приводит к получению представления ловушек, и для этого не требуется, чтобы обход от int до void * до int сохранял значение. Этот аргумент правильно характеризует стандарт C, но он игнорирует тот факт, что с практической точки зрения подход приведения типов работает практически для каждой реализации C, которая в первую очередь поддерживает pthreads, и что он достаточно распространен, чтобы реализация который он не работал надежно, будет трудно принять.

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