Newsgroup: it.comp.os.linux.development
Titolo: aiuto pthread

Ciao, sto studiano la programmazione multi-thread ma il primo esempio mi da
segmentation fault.
Posto tutto l'esempio, tanto č molto breve.
L'ho editato con KDevelop, e lanciato ma ottengo appunto un segfault, alla
prima creazione del thread. Ci sono opzioni particolari da passare al
compilatore oppure c'č un errore nell'esempio.
Uso Fedora Core 3.
Grazie a tutti!
Paolo.
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <iostream>
#include <cstdlib>
#include "pthread.h"
using namespace std;
#define NUM_THREADS     5
void *PrintHello(void *threadid)
{
   cout << "\nHello World!";//<< *threadid << endl;
   pthread_exit(NULL);
}
int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc=0, t;
   for(t=0;t < NUM_THREADS;t++){
        cout <<"Creating thread" << t << "\n";
      rc = pthread_create(&threads[t], NULL, PrintHello, (void*)t);
      if (rc){
         cerr << "ERROR; return code from pthread_create() is " << rc <<
endl;
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

 Uso Fedora Core 3.
Premessa: sto imparando il c++.
Compilando con il seguente comando funziona:
     g++ pthread.cpp -lpthread
Non mi spiego perche' compilando con il seguente comando:
     g++ pthread.cpp
non ho errori di compilazione ma ottengo anch'io un segmentation fault
Compilando un analogo programma in C ottengo, come mi aspettavo, un 
errore di linker se non includo la libreria pthread.
Ciao
Paolo (tuo omonimo ;))

 }
Va in errore perchč passi alla funzione PrintHello un parametro (t) che 
č dichiarato locale in main...fin qui nessun problema, se non per 
l'ultima istruzione, pthread_exit(NULL), che causa la morte del thread
principale (main), causando la deallocazione della memoria puntata da t
che comunque viene usata da PrintHello causando un accesso non 
autorizzato!!!

 
Semplicemente perchè con il gcc non c'è il linkaggio in automatico, ma
può benissimo compilare codice C++ includendo il tutto necessario.

 }
L'ultima istruzione, in ogni caso, č inutile perchč il thread (main) 
termina lo stesso una volta che l'esecuzione esce dal corpo della funzione!

 autorizzato!!!
Non mi convince.
Perche' ottengo un segmentation fault anche con questo codice (notare la 
funzione sleep prima di terminare) e ovviamente non ho alcun problema se 
linko esplicitamente la libreria phread ?
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <iostream>
#include <cstdlib>
#include "pthread.h"
using namespace std;
#define NUM_THREADS     5
void *PrintHello(void *threadid)
{
    cout << "\nHello World!";//<< *threadid << endl;
    pthread_exit(NULL);
}
int main (int argc, char *argv[])
{
    pthread_t threads[NUM_THREADS];
    int rc=0, t;
    for(t=0;t < NUM_THREADS;t++){
         cout <<"Creating thread" << t << "\n";
       rc = pthread_create(&threads[t], NULL, PrintHello, (void*)t);
       if (rc){
          cerr << "ERROR; return code from pthread_create() is " << rc 
<<  endl;
          exit(-1);
       }
    }
    sleep(10);
    pthread_exit(NULL);
}
E poi ancora.
Perche' ho segmentation fault anche se dichiaro la variabile t globale 
spostando la sua dichiarazione appena dopo la #define NUM_THREADS 5 ?
Ciao
Paolo

 E' solo un caso; g++ dovrebbe pensare al linkaggio in automatico.
Grazie. Si impara sempre qualcosa.
Dovro' comunque approfondire la cosa perche' con un'altra libreria con 
cui sto giocando (FLTK) devo inserire esplicitamente la direttiva.
Ciao
Paolo

 }
...
Inizia con il fare pthread_join su ognuno dei thread che crei, al posto
dello sleep. Che poi la sleep é fatta con SIGALARM e mischiare thread e
segnali é un terreno minato.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
	**ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
 -<! Woe to you, oh Earth and Sea, for the Devil sends the Beast with
      wrath, because He knows the time is short... !>- Revelations, XIII - 18