|
|
|
![]() |
|
Strumenti |
![]() |
#21 |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quello che succede è di semplice interpretazione.
Le variabili locali sono allocate nello stack. Ogni volta che il thread termina semplicemente la cima dello stack viene spostata in alto in modo da non contare più lo spazio occupato dalle variabili locali del thread (che è molto simile ad una funzione). Non viene sovrascritto nulla. I valori sono ancora lì, solo che lo spostamento della cima dello stack fa in modo che per il programma siano cancellati. Al momento dell'esecuzione del thread successivo la cima dello stack viene rispostata in basso per fare posto alla nuova variabile "x" del nuovo thread che, non venendo inizializzata, ha ancora il valore di quella del vecchio. Probabilmente il valore sarebbe stato "veramente casuale" se l'esecuzione dei thread avvenissero veramente in contemporanea. (cioè ad esempio due o più thread vengono creati allo stesso tempo). Con molta probabilità questo non avviene. Questi thread sembrano essere molto rapidi da eseguire e più che essere eseguiti in parallelo vengono eseguiti in maniera seriale (come fossero delle funzioni, perchè un thread finisce prima che quello successivo sia stato creato) . La cosa si dovrebbe far sentire ancor di più su una macchina monoprocessore/monocore. Ciao
__________________
GPU Compiler Engineer |
![]() |
![]() |
![]() |
#22 | |
Member
Iscritto dal: Feb 2001
Città: Nelle Langhe, dove non c'è tecnologia ma solo buon vino
Messaggi: 154
|
Quote:
Invito anche te a leggere, se hai voglia s'intende, l'esempio che ho postato qui quotato come "Esempio con 3 threads che arrivano in maniera concorrenziale(conteporeaneamente)". Perchè questo è quello che abbiamo potuto simulare e toccare con mano testandolo direttamente sulla macchina.
__________________
spammo un casino! ![]() |
|
![]() |
![]() |
![]() |
#23 | |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Sembra quasi come se lo stack venga scalato alla fine di un thread col risultato che il thread spawnato dopo va ad utilizzare il valore di "X" del thread precedente ... Una cosa tipo : 1) il primo thread inizia , inizializza X a zero e ci somma 1, fa printf X , SWITCH 2) il secondo thread inizia, inizializza la propria X a zero (che sta sopra alla X del primo thread non ancora terminato) , SWITCH 3) il primo thread termina e lo stack viene ripristinato (facendolo crescere in modo da eliminare la variabile X del primo thread, ma in realtà viene eliminata quella del secondo thread che è quella in cima allo stack) 4) il secondo thread somma 1 alla X del primo thread (erroneamente) e la stampa a schermo, SWITCH 5) continua così anche con gli altri thread. Potrebbe essere un possibile motivo del malfunzionamento .... anche se mi sembra un po' inverosimile. Non sono un grande esperto di pthreads. Ciao
__________________
GPU Compiler Engineer |
|
![]() |
![]() |
![]() |
#24 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
I thread per definizione condividono lo spazio di indirizzamento del processo/thread che li crea. Quindi di qui non si scappa. Due thread concorrenti girano nello stesso spazio di indirizzamento, altrimenti non sarebbero concorrenti e la concorrenza dovrebbe essere stabilita tramite meccanismi di comunicazione interprocesso (vedi pipe, fifo, mailslot etc).
|
![]() |
![]() |
![]() |
#25 |
Member
Iscritto dal: Feb 2001
Città: Nelle Langhe, dove non c'è tecnologia ma solo buon vino
Messaggi: 154
|
Già, è molto inverosimile ma qua siamo alla frutta, è da giorni che siamo fermi. Abbiamo ricompilato e riscritto da 0 codice per testare queste cose ma il risultato è quello..
Conosciamo il problema ma non sappiamo proprio come risolverlo, speriamo che a qualcuno venga una bella ideona, se no... ![]() In ogni caso grazie per averci provato ![]()
__________________
spammo un casino! ![]() |
![]() |
![]() |
![]() |
#26 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
ilnostrothread(NULL); ilnostrothread(NULL); Molto probabilmente stamperebbe 1 e 2. Nel codice che avete postato non c'è alcun malfunzionamento. E' semplicemente lo stato delle cose. |
|
![]() |
![]() |
![]() |
#27 | |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Molto , molto strano
__________________
GPU Compiler Engineer |
|
![]() |
![]() |
![]() |
#28 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Io non ho ancora capito qual'è il problema...o meglio...come la questione vada ad influire sul vostro codice. Se influisce significa che non avete inizializzato delle variabili.
|
![]() |
![]() |
![]() |
#29 | ||
Member
Iscritto dal: Feb 2001
Città: Nelle Langhe, dove non c'è tecnologia ma solo buon vino
Messaggi: 154
|
Quote:
Quote:
Boh, non avessi provato con le mie mani ogni caso, non avessimo riscritto da 0 codice apposta per fare tests, non fossi sicuro d'avere chiara la situazione e soprattutto non fossi sicuro d'aver scritto un codice senza bugs, non starei qui a whinare come una bestia.... LOL ![]()
__________________
spammo un casino! ![]() |
||
![]() |
![]() |
![]() |
#30 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#31 | |
Member
Iscritto dal: Feb 2001
Città: Nelle Langhe, dove non c'è tecnologia ma solo buon vino
Messaggi: 154
|
Quote:
Meglio di così non riesco proprio a spiegarlo..
__________________
spammo un casino! ![]() |
|
![]() |
![]() |
![]() |
#32 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
![]() |
![]() |
![]() |
#33 | |
Member
Iscritto dal: Feb 2001
Città: Nelle Langhe, dove non c'è tecnologia ma solo buon vino
Messaggi: 154
|
Quote:
Come spiegato qui, nell'esempio "Esempio con 3 threads che arrivano in maniera concorrenziale(conteporeaneamente)" c'è un problema concorrenziale dal quale non riusciamo ad uscire.
__________________
spammo un casino! ![]() |
|
![]() |
![]() |
![]() |
#34 |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Forse ci siamo.
Dovete creare una variabile (nel main) di tipo "pthread_t" per ogni thread che volete lanciare in concorrenza Quindi se volete mandare al massimo 10 thread contemporaneamente in esecuzione fate una cosa tipo : pthread_t threads[10]; pthread_create(&threads[x], ....); <--- dove X è il numero del thread che volete lanciare. Non riutilizzate sempre lo stesso. Ciao
__________________
GPU Compiler Engineer |
![]() |
![]() |
![]() |
#35 | |
Member
Iscritto dal: Feb 2001
Città: Nelle Langhe, dove non c'è tecnologia ma solo buon vino
Messaggi: 154
|
Quote:
Noi l'abbiamo fatto diversi test concorrenziali e il risultato è quello che ho scritto qui nell'ultimo esempio.
__________________
spammo un casino! ![]() |
|
![]() |
![]() |
![]() |
#36 | |
Member
Iscritto dal: Feb 2001
Città: Nelle Langhe, dove non c'è tecnologia ma solo buon vino
Messaggi: 154
|
Quote:
![]() Abbiamo provato ad adottare anche questa soluzione ma ci siamo bloccati per un "piccolo" motivo: quello che questo programma è un daemon sempre in esecuzione, come facciamo a creare un array finito di threads quando le richieste sono tecnicamente infinite? La soluzione "numero molto grosso" è troppo sporca ed inefficente ed è stata scartata. Ma in ogni caso, se questa è effettivamente la soluzione al nostro problema dovremmo creare una lista di threads, ma poi, come la andiamo a gestire? ![]()
__________________
spammo un casino! ![]() |
|
![]() |
![]() |
![]() |
#37 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 4329
|
nono spe, mi son perso un bel po di reply...grazie a tutti per le risposte innanzitutto....dunque, i thread creabili non sono in numero finito ne prederminabile in alcun modo; posso pensare che da questo stato di cose non sia facile uscire facilmente...va a finire che dovremo reinizializzare le variabili ogni volta e infilare l intero codice dei thread entro un mutex (cioe cio che ci hanno chiesto di non fare)...sinceramente non vedo altre soluzioni per evitare che qualcosa dentro un thread sia sporcata da qualcos altro di un altro thread...spero di essermi spiegato
__________________
|18k+|slk800|a7n8x|1Gb/ddr400|Gf4mx440|Pio108|WD 160Gb|Case|Uni|Album|AnimeClick|OneManga| |ClassicThrash!|BNR Metal|TrueMetal|Dime|Chuck| |
![]() |
![]() |
![]() |
#38 | |
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4741
|
Quote:
e per istruire il compilatore all' uso del TLS sarebbe prevista una keyword apposita __thread int x;
__________________
Jappilas is a character created by a friend for his own comic - I feel honored he allowed me to bear his name Saber's true name belongs to myth - a Heroic Soul out of legends, fighting in our time to fullfill her only wish Let her image remind of her story, and of the emotions that flew from my heart when i assisted to her Fate
Ultima modifica di jappilas : 06-11-2007 alle 21:31. |
|
![]() |
![]() |
![]() |
#39 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Ma scusate potete postare un pezzo di codice reale in cui si manifesta questo problema?
Perchè se inizializzate tutte le variabili e dopo l'inizializzazione queste risultano corrotte ci deve essere un problema da qualche altra parte. |
![]() |
![]() |
![]() |
#40 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non ho capito questo esempio:
SIMULAZIONE POSSIBILE: 1) creazione ilnostrothread_1. 2) inizio computazione ilnostrothread_1, int x = 0, sleep, context switch. 3) creazione ilnostrothread_2. 4) inizio computazione ilnostrothread_2, int x = 0, sleep, context switch. 5) creazione ilnostrothread_3. 6) inizio computazione ilnostrothread_3, int x = 0, sleep, context switch. 7) proseguimento computazione ilnostrothread_1, x++, x = 1, "1", pthread_exit. 8) proseguimento computazione ilnostrothread_1, x++, x = 2, "2", pthread_exit. 9) proseguimento computazione ilnostrothread_1, x++, x = 3, "3", pthread_exit. Questo è quello che volete ottenere o quello che NON volete si ottenga ? L'output in questo caso è ovviamente 1, 1, 1 |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:30.