2013-11-25 6 views
1

Так что я пытаюсь использовать pthread_create, но я получаюАргумент типа несоответствие (аннулируются *)

error: argument of type ‘void* (server::)(void*)’ does not match ‘void* (*)(void*)’ 

Класс определяется следующим образом:

class server : public AL::ALModule 
{ 
    public: 
    server(boost::shared_ptr<AL::ALBroker> pBroker, const std::string& pName); 
    .... 
    void *ThreadMain(void *arg);    
} 

};

А вот функция, где я звоню PTHREAD от:

int server::listen() { 

TCPServerSocket servSock(6004); 
... 

for (;;) {  

    clntSock = servSock.accept(); 
    ... 
    pthread_t threadID;   
    pthread_create(&threadID, NULL, this->ThreadMain,(void *) clntSock); 
    ... 
    } 
} 

Как бросить ThreadMain от сервера :: до *?

Заранее благодарен!

+4

'ThreadMain' является функцией-членом. Если вы бросите его, он не будет делать то, что, по вашему мнению, будет. Вы должны сделать функцию 'static' и передать' this' в качестве аргумента, если ей нужно получить доступ к атрибутам класса. – agbinfo

+0

Если нет необходимости обращаться к элементам-атрибутам, просто создайте статичность ThreadMain и она должна работать. – agbinfo

+0

@agbinfo При попытке передать это как аргумент, я получаю: неверное преобразование из 'void * (*) (server &)' в 'void * (*) (void *)' –

ответ

1
void *ThreadMain(void* arg) 

должен быть

static void ThreadMain(void* arg) 

и призывание:

pthread_create(&threadID, NULL, &(server::ThreadMain), (void *) clntSock); 

Нить вы создаете не имеет возможности узнать, что ваш this указатель; C++ пытается защитить вас от этого факта, заставив вас признать, что ThreadMain является статическим и не может получить доступ к нестационарным свойствам.

Проблемы с использованием &(this->anyFunc) что this не имеет фактическую ссылки на его методу, если они не указатели на функцию или виртуальные, и не сам метода есть какие-либо ссылки на соответствующий this, если это не предусмотрено вызывающим (неявно) ,

+0

Да. Первый - это прототип функции, а второй - указатель на функцию void. –

+0

Спасибо, похоже, что он преобразован в сервер :: *, который все еще дает мне ошибку: не может конвертировать 'void * (server :: *) (void *)' to 'void * (*) (void *)' для аргумент '3' to 'int pthread_create (pthread_t *, const pthread_attr_t *, void * (*) (void *), void *)' –

+0

Я пытаюсь избежать использования статических функций, потому что хочу получить доступ к другим членам класс. Есть ли другой способ преодолеть это? –

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