int pthread_create(pthread_t * thridptr, pthread_attr_t *attptr, void * (*(void *) start, void *arg);
Casting to the expected types only works if the arguments behave as those types.
For example, if a function has void return type but is cast as returning void *, problems may or may not occur depending on the calling protocol of the underlying machine.