согласно man page из pthread_create()
, мы можем видеть, подпись функции
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
где третий аргумент типа
void *(*start_routine) (void *)
, что означает, что он ожидает указатель на функцию с возвращаемым типом void *
и принимает аргумент void *
. Таким образом, нам необходимо определить функцию потока соответственно.
Тем не менее, в отношении использования void
указателя для передачи аргументов, цитирование C11
, глава §6.3.2.3
Указатель на void
могут быть преобразованы в или из указателя на любой тип объекта. Указатель на любой тип объекта может быть преобразован в указатель на void
и обратно; результат сравнивается с исходным указателем.
Как мы можем видеть, void
указателя используется для передачи любого типа данных для функции потока, при условии, что преобразуется обратно к фактическому типу внутри функции.
Кроме того, FWIW, не пытайтесь отклоняться от необходимой подписи указателя функции, так как стандарт четко предписывает
[....] Если преобразованный указатель используется для вызова функции которого тип не совместим с ссылочным типом, поведение не определено. Если вы не хотите (нужно) передать какое-либо действительное значение аргумента, вы всегда можете пройти NULL
.
Вы можете тривиально написать оболочку: 'void * ThreadMethod (void *) {SomeMethod(); return NULL; } ' –
Фактически' void * foo() 'является допустимым C, хотя и устаревшим, так как он не указывает его список параметров. – Noldorin