2013-05-31 6 views
0

Попытки написать простую многопоточный сервер программу и получил эту ошибку в последнее время:pthread_create аргумент прохождение ошибки

server.cpp: 64: 64: ошибка: аргумент типа «недействительный * (Сервер ::) (недействительный *) 'не соответствует' недействительным * (* ) (аннулируются *)

Вот несколько строк из моего кода:

Заголовок файла:

class Server 
{ 
public: 
void establishConnection(const char *); 
... 

private: 
void *listening(void *); 
void *acceptingConnection(void *); 
pthread_attr_t attrr; 
} 

CPP файл:

void Server:: establishConnection(const char *port_number) 
{ 
... 
    pthread_create(&listn, &attrr, Server::listening, (void*)socketfd);//pthread_t listn, socketfd is a socket destricptor(int)  
    pthread_join(listn, NULL); 

} 
void* Server::listening(void *arg) 
{ 
    int socketfd = (int)arg; 
    ... 
} 

Обычно, если я определяю нить прототипы функций в CPP файле вместо заголовка файла, он работает правильно (без сервера :: определение, конечно) Пробовал несколько других вещей, как (пустоте *) Сервер :: прослушивание, прослушивание, (void *) прослушивание, но все равно не работало. Не могли бы вы просветить меня? Как передать параметр метода методу прослушивания?

Во-вторых, я изучаю C++ в настоящее время (уже знаю C), верно ли использовать некоторые C-методы, char * массивы вместо строк, заголовочные файлы в C++-программе? Например, string.h, stdlib.h, pthread.h?

+0

Точный дубликат функции [pthread из класса] (http://stackoverflow.com/questions/1151582/pthread-function-from-a-class) –

ответ

1

Вам необходимо создать функцию обертки для pthread_create(), а оттуда вызвать метод класса.

class Server 
{ 
... 
private: 
int sock; 
}; 

extern "C" void * server_listening (void *arg) { 
    Server *s = static_cast<Server *>(arg); 
    return s->listening(); 
} 

void Server:: establishConnection(const char *port_number) 
{ 
... 
    this->sock = socketfd; 
    pthread_create(&listn, &attrr, server_listening, this); 
    pthread_join(listn, NULL); 
} 

extern "C" связи на функции обертки на месте, так как pthread_create() является функцией С, и ожидает, что указатель на функцию с C связи. Это важно, если в вашей системе C ABI и C++ ABI не совпадают. Статический метод класса может иметь только C++-связь.

+0

получил (а) эту ошибку: Server.cpp: 23: 15: error: 'void *' не является указателем на объект типа – nihirus

+0

@nihirus: Hmpf, fat fingered the answer. Попробуйте использовать 's-> listen()', а не 'arg-> listen()'. – jxh

+0

во-первых, спасибо за ваши ответы, по-прежнему получая ту же ошибку. – nihirus

1

Вы просто можете прочитать сообщение об ошибке:

type ‘void* (Server::)(void*)’ does not match ‘void* (*)(void*)‘ 

Поскольку Server::listening не является статической функции члена Server и указатель функции, не статический член не может быть преобразован в указатель на -нон-член-функция.

Вы должны сделать свою Server::listening функцию static или написать автономную функцию за пределами класса Server.

+0

См. [Этот вопрос/ответ] (http: // stackoverflow.com/a/11871465/315052) для обсуждения того, почему важно использовать автономную функцию 'extern 'C". – jxh

Смежные вопросы