The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Засунуть в pthread_create указатель на не статическую функци..."
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Засунуть в pthread_create указатель на не статическую функци..."
Сообщение от Андрей emailИскать по авторуВ закладки(??) on 11-Янв-05, 19:37  (MSK)
freebsd53[/]# gcc -v
Using built-in specs.
Configured with: FreeBSD/i386 system compiler
Thread model: posix
gcc version 3.4.2 [FreeBSD] 20040728

Дело в том , что надо передать в качестве параметра фунцкции pthread_create ( &threadID, NULL, (void*(*)(void*))object->Start_Thread,NULL) необходимо передать указатель object->Start_Thread на нестатическую функцию-член класса, реализация котрой выглядит так:
void * cMyclass::Start_Thread ( void * ) {
pthread_setcanseltype...
pthread_setcancelstate...
/*реализация*/

}
Сам поток создается в конструкторе класса:
cMyClass::cMyClass () {
this->threadID = 0;
pthread_create ( &threadID, NULL, (void*(*)(void*))this->Start_Thread,NULL);
pthread_join ( threadID );
}
Дело в том, что компилятор выдает несоответствие типов:
g++ -c -Wall -O2  -I. prog.c -lpthread
prog.c: In constructor `cMyClass::cMyClass()':
prog.c:10: error: argument of type `void*(cMyClass::)(void*)' does not match `void*(*)(void*)'
*** Error code 1

можно как-то обойти это не используя статические функции-члены? Кто-нибудь решал подобную проблему?
Спасибо.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Засунуть в pthread_create указатель на не статическую функци..."
Сообщение от DeadMustdie emailИскать по авторуВ закладки(??) on 11-Янв-05, 21:46  (MSK)
Если функция, передаваемая в pthread_create, является методом класса,
то она обязана быть статической. Обойти данное явление можно примерно
таким образом:

class MyClass
{
private:
  void* RealWork()
  {
     // ...
  }

  static void* StubWork(void* arg)
  {
    MyClass* This = (MyClass*)arg;
    void* ret = This->RealWork();
    pthread_exit(ret);
    return ret; // unreached
  }

public:

   MyClass()
   {
     pthread_create (&threadID_, NULL, StubWork, (void*)this);
   }
  
   ~MyClass()
   {
     timeToDie_ = true;
     pthread_join(threadId_);
   }
};

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Засунуть в pthread_create указатель на не статическую функци..."
Сообщение от Андрей emailИскать по авторуВ закладки(??) on 11-Янв-05, 23:22  (MSK)
>Если функция, передаваемая в pthread_create, является методом класса,
>то она обязана быть статической. Обойти данное явление можно примерно
>таким образом:
>
>class MyClass
>{
>private:
>  void* RealWork()
>  {
>     // ...
>  }
>
>  static void* StubWork(void* arg)
>  {
>    MyClass* This = (MyClass*)arg;
>    void* ret = This->RealWork();
>    pthread_exit(ret);
>    return ret; // unreached
>  }
>
>public:
>
>   MyClass()
>   {
>     pthread_create (&threadID_, NULL, StubWork, (void*)this);
>   }
>
>   ~MyClass()
>   {
>     timeToDie_ = true;
>     pthread_join(threadId_);
>   }
>};

Спасибо, Вы подтвердили мой догадки...

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Засунуть в pthread_create указатель на не статическую функци..."
Сообщение от Vladislav Lazarenko emailИскать по авторуВ закладки on 12-Янв-05, 14:32  (MSK)
В boost/stl уже есть какие-то такие templates..

mem_fun вроде или что-то такое.

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру