Пытаюсь понять, как работают pthread_create
и pthread_join
. Я думал, что третий аргумент pthread_create
допускает только функции с одним аргументом void *. Я скомпилировал приведенный ниже код с помощью gcc, и он работал нормально. Но почему?
void *foo() {
return 0;
}
int main() {
pthread_t thread_id;
int par = 5;
pthread_create(&thread_id, NULL, foo, &par);
pthread_join(thread_id, NULL);
return 0;
}
void foo()
означает, что функция foo может принимать любое количество аргументов неизвестного типа, а
void foo(void *)
означает, что функция foo принимает аргумент типа void *
Вот почему программа компилируется, так как ваша функция может принимать аргументы любого типа, включая void *
.
Аргумент void *
является пустым указателем, с которым не связан тип данных. Он может содержать адрес любого типа и может быть приведен к любому типу.
Чтобы найти разницу между foo()
и foo(void *)
, см. здесь
Какая версия gcc? Он должен сказать `.... нет известного преобразования из 'void () 'в' void * () (void *)' для 3-го аргумента`