Newsgroup: it.comp.os.linux.development
Titolo: thread C++ in linux

devo avviare un thread che fa partire uno dei metodi
della mia classe ma non riesco a farlo con pthread_create.
infatti questo metodo sembra vogli una semplice funzione come Child
e non accetta il metodo di una classe....
io voglio far partire come figlio il metodo di una mia classe.
come si fa in C++ e in modo piu pulito possibile?

 ha scritto nel messaggio 
news:fq10fv$v78$1...@newsreader2.mclink.it...

ho trovato questo esempio,
non c'è qualcosa di piu pulito di questo?
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <strings.h>
#include <pthread.h>
#include <iostream.h>
//This C++ class is an abstract representation of a pair of integer numbers.
class pairint{
public:
   pairint(int, int);
   ~pairint() {};
   void add();
   void printpair();
private:
   int _x;
   int _y;
};
pairint::pairint(int x, int y) {
  _x = x;
  _y = y;
};
void pairint::add() {
  cout << "sum of pair is "<< _x+_y << "\n";
};
void pairint::printpair() {
   cout << "value of x is  " << _x << "\n";
   cout << "value of y is  " << _y << "\n";
};
extern "C" void *ThreadStartup(void *);
int main(int argc, char **argv)
{
  pairint  *t=NULL;
  pthread_t     thread;
  int           rc;
  t = new pairint(5,10);
  rc = pthread_create(&thread, NULL, ThreadStartup, (void *)t);
  if (rc) {
    cout << "Failed to create a thread" << "\n";
    exit(EXIT_FAILURE);
  }
  printf("Waiting for thread to complete\n");
  rc = pthread_join(thread, NULL);
  if (rc) {
    cout << "Failed to joint a thread" << "\n";
    exit(EXIT_FAILURE);
  }
  cout << "Tadah" << "\n";
  exit(EXIT_SUCCESS);
}
// This function is a helper function. It has normal C linkage, and is
// the base for newly created pairint objects. It runs the
// add method on the pairint object passed to it (as a void *).
// After this method completes normally (i.e returns),
// we delete the object.
void *ThreadStartup(void *_tgtObject) {
  pairint *tgtObject = (pairint *)_tgtObject;
  tgtObject->add();
  delete tgtObject;
  return (NULL);
}

mitic wrote:

pthread e' una libreria C, io proverei a cercare una libreria C++ che
gestisca i thread e userei quella. 
ilSimo
-- 
now playing: 
Freedoma call
Freedom overall to last forever
                                Angra - Freedom Call

 gestisca i thread e userei quella.
Stavo per rispondere la stessa cosa. Se cerchi su freshmeat dovresti
trovare diverse librerie C++ che gestiscono thread. Considera anche
boost::thread.
Saluti,
The Librarian

sentite...
se usassi delle fork sarebbe sbagliato?
sto facendo un applicazione c++....
e mi occorre creare 3 thread differenti.
(non piu di 3...) 

mitic wrote:

dipende, ma fork() crea _processi_ distinti, non thread.
che poi questo ti vada bene lo stesso e' un'altro discorso (concettualmente
parlando puoi fare piu' o meno le stesse cose, solo in modo un po' diverso)
perche' pensi ti servano i thread e non processi differenti?
ilSimo
-- 
now playing: Metallica - Master Of Puppets
"Suddenly I awoke. I must have fallen asleep under the oak,
where I used to sit and dream as a child
The dawn was soon to come, and the air was crisp and cold
Yet I felt warm
I remembered my strange dreams and knew I had the strength
and love in my heart to create something in my life.
The world was waiting I was reborn"
                                Candlemass - Dawn

 ilSimo
devo creare un'applicazione server che trasferisce su rete un flusso di dati 
di
alcuni MB/s
pensavo di utilizzare un metodo con un loop infinito per la ricezione dei 
dati
dal socket e un'altro metodo per l'invio dei dati sul socket.
fondamentalmente la mia applicazione dovrebbe leggere delle variabili 
d'ambiente e trasferirle
su di un altro pc della rete. generando un flusso di molti MB/s...
una parte del codice è questo:
se genero un processo che su un ciclo infinito
usasse la recv (bloccante) in un thread che resta quindi in attesa di dati
sarebbe sbagliato?
do{
 recv(sock buffer....)
 //invio dati al buffer principale e invio signal
 //al thread principale per indicare l'arrivo dei dati
}while(1)
il thread andrebbe in wait finchè non ci sono dati sulla socket...

 
[cut]
non sono un esperto di programmazione dei socket, ma dovrebbe andare.
ilSimo
-- 
now playing: Einherjer - Wolf-Age
This is our vow
We'll never bow
Maybe we're all gonna die...
But we fight!
                                Drakkar - Eridan Falls

in realtà devo leggere dei file di grandi dimensioni con dati...