Newsgroup: it.comp.lang.c++
Titolo: [SEMI-OT] thread in classe C++

Ciao,
ho una bella classe, e nella mia bella classe
faccio uso della libreria pthread, ovviamente
per linux...
Il mio problema č che la pthread_create() vuole
un puntatore ad una funzione che prende un puntatore
void come parametro e restituisce un puntatore void,
in sintesi: void * (*)(void *)
Il punto come avrete intuito e che devo usare come funzione
thread, una funz della classe che ha la forma diversa di:
void * (*TSender::Funzione)(void *) diversa da quella accettata
da pthread_create().
Come risolvo il problema????
Avevo pensato ad una funzione friend della classe che cosě
rispetta il puntatore di cui sopra, ma non mi va di inquinare
l'incapsulamento della classe.
Qualche idea???
Grazie

 Qualche idea???
http://groups-beta.google.com/group/it.comp.lang.c++/browse_frm/thread/c0c48277570ac9ba
M

 
http://groups-beta.google.com/group/it.comp.lang.c++/browse_frm/thread/c0c48277570ac9ba
Avevo anche pensato a questa soluzione, ma scartata perchè la funzione
che dovrei chiamare è privata...
insomma, posso solo usare una friend function!?!?

 Come risolvo il problema????
Usa una funzione static della classe. Esempio:
class Thread
  {
  public:
    start() 
      { 
      pthread_create( NULL, NULL, & Thread::handler, *this ); 
      }
  private:
    static void * handler( void * p )
      {
      Thread * th_this = static_cast<Thread *>(p);
      th_this -> run();
      return NULL;
      }
  void run();
  };
Se fai diventare virtuale pura run() puoi anche utilizzare Thread come
classe astratta da cui derivare tutte le volte che ti serve un thread
concreto.
Spero di aver dato una mano,
Ciao!
-- 
Qual'e' il colmo per uno studente-lavoratore?
Avere un quadrato che si crede un rettangolo.

   };
Che non funziona. In C++, la funzione pthread_create vuole une
funzione extern "C", ed una funzione membra, anche static, non
può mai essere extern "C". Ci son due soluzionni: rendere la
funzione membra publica, o dichiarare la funzione che passa a
pthread_create amica.
--
James Kanze                                           GABI Software
Conseils en informatique orientée objet/
                   Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, 
+33 (0)1 30 23 00 34

 pthread_create amica.
Funzionare funziona eccome!
Se mi dici che non e' standard, puo' darsi...
Considerando che AlterX ha detto che la deve usare da linux ed ha
specificato l'OT nel subject, ho pensato che potevo dargli questo
consiglio, visto che con il gcc non da' nessun problema.
Ciao.


 Funzionare funziona eccome!
Io ho utilizzato, risolvendo il problema, una funzione friend.
Ma comunque, non ho dichiarato la funzione con extern "C" è il
gcc, come dice qualcuno, lo accetta...magari non è standard, ma
lo accetta.
Grazie a tutti :-)

 problema.
Fin'ora. G++ non esita a rendere le cose illegali quando vuole
lo standard, anche quando funzionnavano primo.


AlterX wrote:
[cut]
Visto che stiamo in tema di thread...
ho un bel problema strano:
i thread sembrano funzionare bene, ma quando provo ad aprire i socket (uno
per ogni thread), viene eseguito tutto, ma all'istruzione:
dominio = gethostbyname("
www.pippo.it
");
si blocca, nel senso che esegui l'istruzione, ma sembra ignorare tutto,
il test, eventuali printf dopo l'istruzione (appunto per vedere se supera
quella istruzione), e termina il programma normalmente...
Come è possibile che non segnala un errore o altro?!?
Ho letto nella guida che gethostbyname restituisce un puntatore a memoria
static, quindi non compatibile con più threads.
Infatti, prima di eseguire i thread in sequenza, ne viene aperto uno che
viene risolto in modo corretto, ma poi...il problema!

 problema!
Leggi la documentazione. Nello standard Posix, è scritto
esplicitamente que "gethostbyname" non funzionna in multithread,
che devi utilisare piùtosto gethostbyname_r. (È anchè scritto
che "The getaddrinfo() and getnameinfo() functions are preferred
over the gethostbyaddr() and gethostbyname() functions." e "The
gethostbyaddr() and gethostbyname() functions may be withdrawn
in a future version.")
Credo anchè che queste informazioni devono trovarsi in un gruppa
Unix, e non in un gruppo C++.
