pthread_create из нестатической функции-члена - PullRequest
0 голосов
/ 14 марта 2010

Это несколько похоже на следующее: Функция pthread из класса

Но функция, вызываемая в конце, ссылается на указатель this, поэтому ее нельзя сделать статической.

void * Server::processRequest()
{
     std::string tmp_request, outRequest;
     tmp_request = this->readData();
     outRequest = this->parse(tmp_request);
     this->writeReply(outRequest);
}

void * LaunchMemberFunction(void * obj)
{
    return ((Server *)obj)->processRequest();
}

, а затем ошибки pthread_create

Server SServer(soc);

pthread_create(&handler[tcount], &attr, (void*)LaunchMemberFunction,(void*)&SServer);

:

SS_Twitter.cpp: 819: ошибка: недопустимое преобразование из void * в void * () (void ) SS_Twitter.cpp: 819: ошибка: инициализация аргумента 3 объекта int pthread_create (pthread_t *, const pthread_attr_t *, void * () (void ), void *)

Ответы [ 3 ]

2 голосов
/ 14 марта 2010

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

Я считаю, что он должен скомпилироваться, если вы просто используете &LaunchMemberFunction.

0 голосов
/ 14 марта 2010

Проблема с актерами. Вы приводите указатель функции к void*, который не может быть неявно преобразован в (void (*)(void*) - тип, принятый pthread_create для третьего аргумента.

Вам не нужно приводить аргумент, поскольку он имеет точный тип, но если бы вам пришлось, это было бы:

void LaunchMemberFunction( Server * ); // signature now does not match, cast required:

static_cast<void (*)(void*)>(LaunchMemberFunction)
// or with C casts:
(void (*)(void*))LaunchMemberFunction
0 голосов
/ 14 марта 2010

избавиться от (void *) перед LaunchMemberFunction. Это и ненужно, и неверно, и является причиной вашей ошибки. Язык не будет неявно преобразовывать void * в указатель на тип функции, который понадобится для написанного вами кода. Этот аргумент для pthread_create уже является правильным типом, нет причины приводить его к чему-то другому.

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