|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
[c]MULTI-THREADS: multi esperti a me!
Avrei un problemino con un modulo che logga msg ed errori di un intero progetto.
Questo progetto ha parecchi threads (e io non sono esperto in 3ds) che potrebbero scrivere contemporaneamente i log quindi chiamare nello stesso istante il modulo log. Ci sono problemi ? il S.O. ci pensa da solo o devo fare un ulteriore thread che faccia da interfaccia al loggatore ? grassie ![]()
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
Sono appunto thread quindi uno alla volta con le loro precedenze di privilegio. Sempre uno alla volta non possono scrivere in contemporanea indipendemente dall'OS. |
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
Quote:
Non vorrei sbagliarlo, ma prendilo come hint, che io sappia puoi infischiartene solo se questi thread leggono il file, mentre se scrivono devi usare meccanismi di mutex. Vedi un po se questo può esserti d'aiuto. http://en.wikipedia.org/wiki/File_locking
__________________
Ciao ~ZeRO sTrEsS~ |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
Quote:
Mica la scrittura su file è una operazione atomica?
__________________
Ciao ~ZeRO sTrEsS~ |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Io poi, per motivi di spazio, zippo tutti i log creati eliminando quelli vecchi ma per non appesantire il tutto chiamo in parallelo con una fork il processo zip. Sicuro che posso star tranquillo ?
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
![]() speriamo di no ... sono contro il nucleare ![]()
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
che poi il mio modulo non e´ un processo a parte ma un .o che verra´ linkato a svariati eseguibili che a loto volta creeranno svariati 3ds ...
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Per il log non puoi realizzare una coda di messaggi da scrivere in cui tutti i thread vanno ad accodare le loro richieste così che questa venga svuotata su un thread separato?
Non avresti più problemi di concorrenza in scrittura su file, ma solo di gestione della struttura che userai per la coda. Così facendo hai in più il vantaggio che i thread non vengono "rallentati" dal processo di scrittura su file. |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Grazie comunque ![]()
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
![]() grazie do un´occhiata. Mi e´ appena venuto il crucco a dire che forse con il flag O_SYNC al file si risolve ...
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
Quote:
Write I/O operations on the file descriptor complete as defined by synchronised I/O file integrity completion. Boh prova, sicuramente fai molto prima così, che ad esempio una cosa simile: pthread_mutex_lock(mutex_scrittura) fd = open(file,"rw"); write(fd,'blah',..) close(fd) pthread_mutex_unlock(mutex_scrittura)
__________________
Ciao ~ZeRO sTrEsS~ |
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
se ho capito bene il lock rallenta il tutto perche´ ogni chiamante aspetta il turno suo. Ovvero perdita di prestazioni. Purtroppo penso che non sia la soluzione giusta in questo progetto.
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
correggetemi se sbaglio per favore:
ho messo un Codice:
pthread_mutex_lock(&mutex); ... fprintf(...); ... pthread_mutex_unlock(&mutex); Ma e´ piu´ lento o no ? ![]()
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
Quote:
Però a stò punto devi vedere quanto ti conviene, perchè col buffer hai alcuni svantaggi : 1)nuove strutture dati 2)overhead dovuto al processo thread che deve svuotarlo nel file 3)e credo che anche quando aggiungi roba al buffer, devi usare la mutua esclusione In poche parole, dipende un po da quanti thread hai e da quanto lavorano.
__________________
Ciao ~ZeRO sTrEsS~ |
|
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Grazie a tutti ![]()
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Voto per la soluzione di Tommino. Sincronizzando sull'operazione di scrittura (lock - print - lock) ognuno dei Thread che vuole inviare un messaggio di log deve attendere per il tempo necessario a scrivere i dati. Se i dati finiscono su un disco fisso l'attesa può essere rilevante.
Se usi una coda concorrente con un Thread che la svuota, ogni Thread deve attendere per il tempo necessario a copiare il messaggio o un puntatore al messaggio da una fetta di RAM ad un'altra. Poichè idealmente la rapidità di stoccaggio dei messaggi nella coda è più elevata della velocità di scrittura degli stessi (cioè il rubinetto è molto grande e lo scarico molto piccolo) devi anche introdurre un blocco euristico sull'accodamento dei messaggi. Del genere se il totale dei messaggi passa i dieci megabyte l'accodamento viene bloccato finchè le dimensioni della coda non tornino sotto ad un certo livello di guardia. Nota che il sistema ti consente di ottimizzare le operazioni di scrittura facendo in modo che essa avvenga non ad ogni messaggio ma, ad esempio, al raggiungimento di un numero di byte ottimale per la scrittura. Ad esempio si potrebbe pensare di scrivere i dati a blocchi di dimensioni pari ad un multiplo della dimensione di un cluster.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
E poi per avere sempre i log aggiornati faccio una fflush ad ogni scrittura. Lo so che rallenta ma se crasha vogliamo sapere perche´. La coda pero´ mi piace come idea ...
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:25.