pthread_create я должен использовать & или нет? (C) - PullRequest
0 голосов
/ 29 января 2020

Я узнал о pthreads, но получил один вопрос, на который я получил разные ответы в зависимости от того, кого я спрашиваю. Например:

void *server (void * arg){
   printf("I am running");
   return NULL;
}

int main(int){
   pthread_t thread_server;

   pthread_create(&thread_server, NULL, &server, NULL);

   pthread_join(thread_server, NULL);
   return 0;
}

это правильно или я должен сделать это следующим образом?:

void *server (void * arg){
    printf("I am running");
    return NULL;
 }

 int main(int){
     pthread_t thread_server;

     pthread_create(&thread_server, NULL, server, NULL);

     pthread_join(thread_server, NULL);
     return 0;
  }

Обратите внимание на разницу в pthread_create (& server, или server). Оба, кажется, работают, но тогда в чем разница?

Ответы [ 2 ]

3 голосов
/ 29 января 2020

Обратите внимание на разницу в pthread_create (& server или server). Оба, кажется, работают, но в чем же разница?

pthread_create принимает указатель на функцию. Имя функции неявно преобразуется в указатель на функцию, вам не нужно явно указывать ее адрес. Другими словами, и server, и &server делают здесь одно и то же - передают функцию server указатель на pthread_create.

int main() {
    void f(); // Function.
    void(*p)(); // Function pointer.

    p = &f;
    p = f; // Same effect as above.

    return 0;
}
0 голосов
/ 29 января 2020

Обратите внимание на разницу в pthread_create (& server или server). Оба, кажется, работают, но тогда в чем разница?

Нет эффективной разницы. Они эквивалентны.

Ссылка для этого (в C11): 6.3.2.1 L-значения, массивы и обозначения функций , параграф 4 стандарта C11 :

Обозначение функции - это выражение с типом функции. За исключением случаев, когда это операнд оператора sizeof, оператора _Alignof или унарного оператора &, указатель функции с типом «тип, возвращающий функцию» преобразуется в выражение с типом «указатель на функцию, возвращающую» тип ".

С учетом функции

void *server (void * arg){
   printf("I am running");
   return NULL;
}

Голый идентификатор server в pthread_create(&thread_server, NULL, server, NULL); является таким" указателем функции ", поэтому он неявно преобразуется в функцию указатель. &server уже имеет тип "указатель на функцию".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...