ошибка pthread_create - PullRequest
       3

ошибка pthread_create

1 голос
/ 15 августа 2010

у меня

    client_sock = accept(server_sock, (struct sockaddr *)&client_name, &client_name_len);        
    if (pthread_create(&newthread , NULL, (void * ) accept_request, client_sock) != 0) {
            perror("pthread_create");
    }

Это только часть всего сценария. Каждый раз, когда я пытаюсь его скомпилировать, я получаю warning: passing argument 4 of 'pthread_create' makes pointer from integer without a cast

Есть идеи, почему это происходит? Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 15 августа 2010

Аргумент 4 равен client_sock, что является аргументом, который передается accept_request. Ожидается, что он будет указателем, но, поскольку он только что передан вашей функции, он может быть целым числом без какого-либо вреда. Просто приведите его к void*, чтобы убрать предупреждение.

С другой стороны, третий аргумент accept_request должен быть указателем на функцию, принимающую void* и возвращающую void*. Вам не нужно приводить его к void*. Было бы лучше изменить объявление accept_request, чтобы оно соответствовало спецификации.

void *accept_request( void *client_sock );
3 голосов
/ 15 августа 2010

Я предполагаю, что client_sock определен как "int client_sock". В этом случае вы должны написать следующее:

if (pthread_create(&newthread , NULL, (void * ) accept_request, &client_sock) != 0) {

Затем в accept_request (который, кстати, должен быть функцией, принимающей указатель) вы будете делать так:

void *accept_request( void *client_sock_addr ) {
   int client_sock = *((int*) client_sock_addr);
}

Преобразование int в (void *) может быть непереносимым (поскольку размеры данных int и void * не обязательно совпадают). Конечно, это может работать на вашем текущем компиляторе ...

Спасибо jiles за указание на это: в зависимости от остальной части кода значение по этому адресу может измениться (например, если у вас есть цикл вокруг конструкции accept и 2 принятия приходят до создания одного потока). Самый хороший способ сделать это - распределить память с помощью malloc, например

int *client_sock_addr=malloc(sizeof(int)); 
*client_sock_addr = accept(server_sock, (struct sockaddr *)&client_name, &client_name_len);        
if (pthread_create(&newthread , NULL, (void * ) accept_request, client_sock_addr) != 0) {
        perror("pthread_create");
}

А затем в функции выполните:

void *accept_request( void *param ) {
   int *client_sock_addr = (int*) client_sock_addr;
   int client_sock = *client_sock_addr;

   // Before exiting the thread
   free(client_sock_addr);
}
0 голосов
/ 15 августа 2010

Это просто потому, что вы не соблюдаете сигнатуру pthread_create:

int pthread_create(pthread_t *restrict thread,
              const pthread_attr_t *restrict attr,
              void *(*start_routine)(void*), void *restrict arg);

Как видите, третий аргумент должен быть указателем на функцию, поэтому правильное приведение будет к (void *(*)(void*)) идля client_sock, который будет аргументом для start_routine, вы должны взять адрес, подобный этому &client_sock

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