Re: g++ pthreads WinThreads
On Wed, 26 Jul 2000, Alexander Kotelnikov wrote:
> Hi.
>
> Я пишу CWinThread-интерфейс к LinuxThreads, и возникла сложность:
> есть две функции
> bool CWinThread::CreateThread(...);
> int CWinThread::Run();
>
> Run -- это "main" новой нитки, CreateThread -- функция, запускающая thread.
> Соответственно в CreateThread очень хочется вызвать
>
> pthread_create(&pth,&pth_attr,(void*)&CWinThread::Run),NULL);
>
> на что я получаю:
> CWinThread.cpp: In method `bool CWinThread::CreateThread(long unsigned int = 0, unsigned int = 0, void * = 0)':
> CWinThread.cpp:14: converting from `int (CWinThread::*)()' to `void *'
> CWinThread.cpp:14: ANSI C++ forbids implicit conversion from `void *' in argument passing
> make: *** [CWinThread.lo] Error 1
>
> Это как-бы две ругани. Второй не нравится преобразование к (void*), и на это,
> в принципе, можно забить до поры до времени, но с первой-то что делать?
>
> Если перобразование к (void*) убрать то выйдет:
> CWinThread.cpp:14: converting from `int (CWinThread::*)()' to `void * (*)(void *)'
>
> Если абстрагироваться, то вопрос в том, как сообщить функции из некоторого
> класса в качестве аргумента указатель на (нестатическую) функцию из того же
> класса.
Вообще судя по man pthread_create третьий аргумент к нему должен иметь тип
void * (*start_routine)(void *)
- это так, к слову.
Ответ на вопрос - это никак нельзя. Выход - создать простую функцию
void* CWinThread_Run_wrapper(void* p)
{
return (void*) ((CWinThread*)p)->Run();
};
и передать ее как 3й аргумент pthread_create, и передать указатель на об[ект
CWinThread как четвертый аргумент.
> Спасибо,
> --
> Alexander Kotelnikov
> Saint-Petersburg, Russia
>
>
> --
> To UNSUBSCRIBE, email to debian-russian-request@lists.debian.org
> with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
>
Best regards,
-Vlad
Reply to: