the reason why pthread_create use this is to make things clear. i agree that u can use function pointer to solve the problem, but
if u fn has no parameter, u can ignore that foo
if u fn has one param, u still need convert from void*
if u fn has two more param, u can not use fn pointer to solve the problem.
and more, a simple fn pointer with type cast will give code readers a misundertanding about what type of fn he must and can supply. u still have to explain somewhere that u fn pointer method can only be used for ...
so i believe a good code style will not like this.
yes, for more than one parameters, u need to use struct. many places use such a void* to achieve this purpose.
depends on what u want, u can choose flexibility or easy to read. that is why there are many goto in kernel code.