Потоки С++. Аргументы для pthread_create

Есть несколько вещей, которые я не понимаю в функции pthread_create.

вот заголовок

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

Во-первых, я не знаком с синтаксисом void *(*start_routine)(void*),. Я знаю, что запрошенный здесь аргумент — это имя функции, которая возвращает void * и принимает в качестве аргумента один void *. Предположительно pthread_create будет ссылаться на эту функцию как start_routine. Итак, я полагаю, что этот аргумент будет указателем на функцию? Если да, то какие ключевые элементы синтаксиса делают это так?

Во-вторых, почему pthread_create ожидает функцию с типом возвращаемого значения void *? Что pthread_create сможет делать с данными неизвестного типа?


person Matt Munson    schedule 30.10.2011    source источник


Ответы (2)


void *(*start_routine)(void*) следует читать в следующем порядке:

  • start_routine - Имя аргумента.
  • *start_routine — Значит, этот аргумент — указатель.
  • (*start_routine)(...) - Ага, это указатель на функцию.
  • (*start_routine)(void*) - Теперь мы знаем аргумент(ы) функции.
  • void *(*start_routine)(void*) — И, наконец, это говорит нам о возвращаемом типе функции.

Аргумент void* получает все, что передается в arg, поэтому, если вам нужно передать какой-либо «вход» в ваш новый поток, это один из способов сделать это.

Полученное void* используется как статус выхода потока (в качестве альтернативы явному вызову pthread_exit()). Получить этот статус можно через pthread_join().

person Branko Dimitrijevic    schedule 30.10.2011

  1. void *(*start_routine)(void*) — это указатель на функцию. Все в нем — это «ключевой синтаксис», но в особенности синтаксис (*ptrname)(args).

  2. pthreads ничего не делает с void*, который возвращает процедура start, кроме как возвращает его вам. См. справочную страницу для pthread_join, чтобы узнать, как она возвращается к вам.

person bmargulies    schedule 30.10.2011