|
|
|
![]() |
|
Strumenti |
![]() |
#41 | |
Member
Iscritto dal: Feb 2001
Città: Nelle Langhe, dove non c'è tecnologia ma solo buon vino
Messaggi: 154
|
Quote:
Comunque l'output è scritto e si ottiene "1", "2", "3", magari fosse "ovviamente 1, 1, 1"... ![]() Agli altri 2 reply rispondo domani che ora sono proprio fuso. Grazie a tutti dell'aiuto che ci state dando ![]()
__________________
spammo un casino! ![]() |
|
![]() |
![]() |
![]() |
#42 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Allora avete un'implementazione fallata dei pthread...non c'è altra spiegazione:
Codice:
#include <stdio.h> #include <pthread.h> void *miothread(void * arg) { int x = 0; sleep(1); printf("%d\n", ++x); pthread_exit(0); } int main() { pthread_t t; pthread_create(&t, NULL, miothread, NULL); pthread_create(&t, NULL, miothread, NULL); pthread_create(&t, NULL, miothread, NULL); sleep(2); return 0; } ~$ ./prova 1 1 1 |
![]() |
![]() |
![]() |
#43 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Su che piattaforma siete ?
|
![]() |
![]() |
![]() |
#44 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
In ogni caso l'esempio senza inizializzazione non è stato solo fuorviante, ma proprio non corretto in quanto il problema di base è diverso.
|
![]() |
![]() |
![]() |
#45 |
Senior Member
Iscritto dal: Feb 2004
Città: milano
Messaggi: 2148
|
Ma scusate avete provato a verificare che indirizzi fisici prendono le variabili??
Io son dell'idea di qualche errore nel codice...non me ne vogliate eh ![]() Ultima modifica di airon : 07-11-2007 alle 12:00. |
![]() |
![]() |
![]() |
#46 | |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Non c'entra un tubo , ma sto ascoltando Spirit Crusher .... RIP per l'avatar ![]() [/OT] Comunque anche a me da il risultato corretto sul codice che hai postato. A sto punto non ho capito se è DAVVERO necessario o no che ogni thread abbia la sua variabile "pthread_t" o meno. Magari il fatto che così funziona è solo dato dal caso che tutti i thread finiscano prima che quello successivo venga spawnato . Ciao
__________________
GPU Compiler Engineer |
|
![]() |
![]() |
![]() |
#47 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Che io sappia non è necessario...
[OT] ![]() Ultima modifica di cionci : 07-11-2007 alle 18:06. |
![]() |
![]() |
![]() |
#48 |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Il fatto è che su tutti gli esempi che ho trovato viene usata una variabile per OGNI thread lanciato, tipo qua : http://www.llnl.gov/computing/tutorials/pthreads/
__________________
GPU Compiler Engineer |
![]() |
![]() |
![]() |
#49 | |
Senior Member
Iscritto dal: Feb 2004
Città: milano
Messaggi: 2148
|
Quote:
Ogni thread avrà in ogni caso il suo id e, come da teoria che ci sta sotto, le proprie variabili, stack, file ecc. Io ho provato a creare diversi tipi di thread, giusto per farli sovrapporre, e non ho riscontato problemi. |
|
![]() |
![]() |
![]() |
#50 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Imho è solo un riferimento. Ovviamente se devi usare il join il riferimento ti serve, se non lo usi il riferimento lo puoi tranquillamente lasciar perdere
![]() |
![]() |
![]() |
![]() |
#51 |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Allora a sto punto diventa fondamentale sapere che implementazione dei pthread stanno usando e su che SO, perchè rimane l'unica cosa da incolpare
![]() Ciao
__________________
GPU Compiler Engineer |
![]() |
![]() |
![]() |
#52 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 4329
|
solaris 10...
abbiamo "risolto", nel senso che mallochiamo anche il piu piccolo spillo e inizializziamo qualsiasi cosa ogni volta che si deve usare...ora sono usciti altri problemi ancora piu stronzi e impensabili, ma per il cercheremo di fixare da soli...nonappena mi accorgero di non farcela, se trovero il modo di formularlo in italiano comprensbile, provero a postare... ...il succo del problema che abbiamo esposto finora era che allocando un nuovo thread dopo che l altro era morto (e non reinizializzando le variabili), questo si trovava a pescare gli indirizzi -anche- delle variabili locali del thread precedente che ovviamente hanno un loro valore...brutto, si, antipatico anche, ma non del tutto incredibile, ne sbagliato tra l altro...è solo la politica seguita sal so e siam stati piciu noi a non inizializzare tutto ogni volta...
__________________
|18k+|slk800|a7n8x|1Gb/ddr400|Gf4mx440|Pio108|WD 160Gb|Case|Uni|Album|AnimeClick|OneManga| |ClassicThrash!|BNR Metal|TrueMetal|Dime|Chuck| |
![]() |
![]() |
![]() |
#53 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
![]() |
![]() |
![]() |
#54 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
![]() Se non devono farlo niente di piu' semplice: le inizializzate ed ogni thread avra' il valore iniziale previsto. Ovviamente se non inizializzate può essere che un nuovo thread riutilizzi la memoria del precedente per cui vedete i valori precedenti, ma questo e' un caso fortuito dovuto al fatto che c'è un errore nel codice (variabile non inizializzata). Se dovete scambiare valori tra variabili non potete usare variabili locali ai thread. Dichiarate la variabile fuori dal thread e la passate come argomento durante la pthread_create. Ad esempio Codice:
void *miothread(void * arg) { int& x = * static_cast<int*>(arg); sleep(1); printf("%d\n", ++x); pthread_exit(0); } int main() { volatile int x = 0; pthread_t t1; pthread_t t2; pthread_create( &t1, NULL, miothread, (void*)&x ); pthread_create( &t2, NULL, miothread, (void*)&x ); pthread_join(t1, NULL); pthread_join(t2, NULL); }
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele Ultima modifica di marco.r : 08-11-2007 alle 12:58. Motivo: corretto il codice |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:28.