Newsgroup: it.comp.lang.c++
Titolo: Thread dov'e' l'errore?

Eseguendo questo codice mi becco un bel Segmentation Fault quando incorro nella
funzione pthread_create...
#include <iostream>
#include </usr/include/g++-v3/bits/stl_threads.h>
using namespace std;
void* print_message_function( void *ptr )
{
    char *message;
    message = (char *) ptr;
    cout << *message;
}
int main () {
     pthread_t thread1;
     char *message1 = "Thread 1";
     int iret1 = pthread_create( &thread1, NULL, &print_message_function, (void*
)message1);
  [CODICE CHE NON VIENE NEPPURE ESEGUITO E ININFLUENTE]
  return 0;
}
--
| /
| \Byte - Andrea Briganti - 
kbyt...@freemail.it
http://www.kbytesystem.fasturl.it
ICQ: 40872731


Ci fai vedere come e' fatto il prototipo della funzione (non standard)
pthread_create e quello che dice il suo eventuale file di aiuto di libreria?
(se sei sotto linux per esempio, digiti man pthread_create o qualcosa di
simile).
L'importante comunque sarebbe vederne il prototipo.
Maurus

Vi suggerisco di spostarvi su it.comp.os.linux.development . Qui siete
fuori tema.
Ciao,
Nicola


Non sono sicuro ma ho come il sospetto che quel passare la stringa
dichiarata localmente e staticamente nel main al thread, possa provocare il
crash.
Scusami Nicola ma non penso di essere OT (forse un po' per cio' che riguarda
il thread, ma non per problemi di crash causati dall'utilizzo di variabili
allocate staticamente e fuori dal loro scope).
Il puntatore alla stringa message1 che qui viene allocata staticamente nel
main, viene passata a una funzioneper essere utilizzato in un altro "thread"
(concetto sconosciuto al C++ standard) ed essendo fuori dal suo scope perde
di significato, da cui il crash.
Potresti fare una prova ad allocare dinamicamente la stringa message1 del
main, cosi' sei sicuro che al momento in cui sara' usata nella
print_message_function, sia ancora valida.
Maurus

 pthread_create e quello che dice il suo eventuale file di aiuto di libreria?
Il prototipo e l'uso era giusto... mancava un piccolo parametro al compilatore
(-lpthread)


 tema.
Scusa che te lo dico... ma era OT un corno...
Da quanto mi risulta l'header stl_pthread sia nelle lib del c++ standard, poi
che si interfacci con librerie specifiche è un altro conto.
Eppoi dire che i thread sono solo per unix è una cosa triste... almeno per gli
utilizzatori di windows...
Il mio post serviva solo a capire se stavo commettendo errori di codice.


 --
Mi spiace deluderti ma per quelle 2 cose che hai scritto eri OT.
Il C++ standard non contempla l'uso di threads per cui il tuo header e'
fuori dallo standard.
Inoltre il fatto che la soluzione al problema fosse un parametro da passare
al tuo compilatore e' fortemente non standard per cui OT2 la vendetta :-)
Vedi piuttosto il mio altro post dove ti suggerisco di allocare
dinamicamente la stringa, cosa che potrebbe evitarti ulteriori problemi.
Maurus

 Il mio post serviva solo a capire se stavo commettendo errori di codice.
Dal punto di vista dello standard C++ il tuo codice sarebbe ricaduto
*comunque* nel comportamento indefinito, indipendentemente dall'uso
corretto o meno dei thread POSIX.
Ciao,
Nicola

di significato, da cui il crash.
No. La variabile message1 smette di esistere, ma il suo
valore era l'indirizzo di un literal che viene garantito
restare valido per tutta la durata del programma.
Ovviamente il C++ non dice nulla riguardo ai thread in
genere e quindi lo standard non puo' dire se quel codice
e' corretto o meno; comunque la causa non la cercherei
nella durata del literal.
Completamente diverso se fosse stato scritto qualcosa
come:
   void foo()
   {
     char b[] = "This is a test";
     bar(b);
   }
in cui si tratta di un array locale che viene
inizializzato con determinati caratteri. Questo
array smette di esistere alla fine della funzione
e non e' quindi permesso fare riferimento al suo
contenuto dopo il termine della funzione.
HTH
Andrea

 standard, 
ti risulta male.
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it