[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: