Это указатель на функцию (или указатель на функцию).
void(*pfn)(void*)
Этот код разбивается следующим образом:
*pfn
(имя указателя, т.е. указатель на функцию)
(void *)
(это параметры функции, т. е. простой указатель на что-либо)
void
(это возврат изfunction)
Итак, если у вас есть такая функция:
void DoSomeThing(void *data) {
... does something....
}
, вы можете передать ее в функцию CreateThread
следующим образом ...
int i = 99;
void * arg = (void*)&i;
pthread_t thread = CreateThread(DoSomeThing, arg, ... other parameters ...);
Так что где-то в CreateThread
он сделает вызов:
pfn(parg);
, и будет вызвана ваша функция DoSomeThing, и вы получите void * data
аргумент, который вы передали.
Дополнительная информация:
Помните, что код - это просто последовательность байтов в памяти.Именно то, как процессор их интерпретирует, отличает их от того, что мы называем данными.
Таким образом, в любой точке программы мы можем ссылаться на другую часть кода по ее адресу в памяти.Так как код разбит на функции в C, это полезная единица повторного использования, которую C понимает и позволяет нам рассматривать адрес функции как просто еще один указатель на некоторые данные.
В приведенном выше примере функции CreateThread требуется адрес функции, чтобы она могла выполнять эту функцию в новом потоке.Таким образом, мы передаем ему указатель на эту функцию.Следовательно, мы передаем ему указатель на функцию .