Да, нет никакой необходимости в гипсе или &
оператора там:
pthread_create(&thread, NULL, print_hello_world, NULL);
должно хватить как имя функции преобразуется в указатель на функцию при передаче в качестве аргумента функции (ов).
Обратите внимание, что указатель функции, который вы передаете на pthread_create()
, принимает в качестве аргумента void*
и возвращает void *
. Так что ваша функция должна быть:
void* print_hello_world(void *unused) {
...
}
Это C способ реализации «общий» тип данных. Например, вы можете передать int*
или struct args*
функции потока и вернуть ее обратно. .
int i=5;
pthread_create(&thread, NULL, print_hello_world, &i);
и в функции print_hello_world()
, вы могли бы сделать:
void *print_hello_world(void *value) {
int i = *(int*)value;
...
}
В основном void*
позволяет передавать любой указатель данных в функцию потока здесь. Если бы функция pthread_create()
в потоке принимала int*
, вы не смогли бы передать ей struct args*
.
Я предлагаю вам прочитать следующие сообщения для получения дополнительной информации о пустом указателе и его использование в C:
Concept of void pointer in C programming и What does void* mean and how to use it?
Что может быть недействительным * возможно? Поскольку int * означает, что возвращаемое значение является целым указателем. Указатель void не имеет смысла. :/ – Utkarsh
Не могли бы вы рассказать? Я не мог понять – Utkarsh
@UtkarshGupta Комментарий становился слишком большим. См. Обновленный ответ. –